Python + Django页面重定向


Answers:


250

这很简单:

from django.http import HttpResponseRedirect

def myview(request):
    ...
    return HttpResponseRedirect("/path/")

官方Django文档中的更多信息

更新:Django 1.0

显然,现在使用,在Django中有一种更好的方法generic views

范例-

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',   
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

通用视图文档中还有更多内容。信贷银行的Barrobés

更新#2:Django 1.3+

在Django 1.5中,redirect_to不再存在,并已由RedirectView代替。感谢Yonatan

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

8
从Django 1.0开始,这不再是最好的方法。看到这个答案:stackoverflow.com/questions/523356/python-django-page-redirect/...
杰克

2
为什么不使用redirectfrom django.shortcuts
Afshin Mehrabani 2012年

4
我使用('^pattern/$', lambda x: redirect('/redirect/url/'))
mrmagooey

5
从Django 1.5开始不推荐使用。使用“ RedirectView”代替:docs.djangoproject.com/en/1.5/ref/class-based-views/base/…–
Yonatan

它实际上没有被弃用,您是说什么被弃用?重定向?使用这种方法,我不知道如何将参数值传递给lambda,即url(r'^(?P <location_id> \ d +)/ $',lambda x:HttpResponseRedirect(reverse('dailyreport_location',args = ['%(location_id)',])))不起作用
radtek

113

根据您的需要(即,如果您不想进行任何其他预处理),仅使用Django的redirect_to通用视图会更简单:

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

有关更多高级示例,请参见文档


对于Django 1.3+,请使用:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

+1用于使用通用视图,而不是像(当前)最高投票答案中那样实现自己的视图(无论多么简单)。
日,0:

如果您确实想进行其他预处理,是否有人有任何示例?
eageranalyst 2011年

1
然后,我建议编写一个自定义视图来进行处理,然后调用通用视图,或者编写一个装饰器,例如pre_process并装饰通用视图:(r'^ one / $',pre_process(redirect_to),{'url ':'/ another /'})
CarlesBarrobés2011年

1
@niallsco:如果您要进行其他处理,则最好使用Kennu在此处
Lie Ryan

1
在django 1.4中,导入redirect_to会给出贬低警告。
2012年

38

实际上,有一个比为每个重定向查看都有更简单的方法-您可以直接在中执行此操作urls.py

from django.http import HttpResponsePermanentRedirect

urlpatterns = patterns(
    '',
    # ...normal patterns here...
    (r'^bad-old-link\.php',
     lambda request: HttpResponsePermanentRedirect('/nice-link')),
)

目标既可以是可调用的,也可以是字符串,这是我在这里使用的。


2
的确如此,但是使用redirect_todjango随附的通用视图仍然更加简单且可读性强。见普约尔答案stackoverflow.com/questions/523356/python-django-page-redirect/...

28

从Django 1.1开始,您还可以使用更简单的重定向快捷方式:

from django.shortcuts import redirect

def myview(request):
    return redirect('/path')

它还需要一个可选的persistent = True关键字参数。


14

如果您想重定向整个子文件夹,那么RedirectView中url参数实际上是插值的,因此您可以在以下代码中执行以下操作urls.py

from django.conf.urls.defaults import url
from django.views.generic import RedirectView

urlpatterns = [
    url(r'^old/(?P<path>.*)$', RedirectView.as_view(url='/new_path/%(path)s')),
]

?P<path>您捕捉将被送入RedirectView。然后,该捕获的变量将替换为url您提供的参数,/new_path/yay/mypath如果您的原始路径为,则会给我们/old/yay/mypath

….as_view(url='…', query_string=True)如果您也想复制查询字符串,也可以这样做。


10

在Django 1.3版中,基于类的方法是:

from django.conf.urls.defaults import patterns, url
from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-url/$', RedirectView.as_view(url='/redirect-url/'), name='some_redirect'),
)

此示例位于urls.py中


6

谨防。我在开发服务器上进行了此操作,并希望稍后进行更改。

我必须清除缓存以进行更改。为了避免将来出现这种令人头疼的问题,我可以将其设置为临时状态,如下所示:

from django.views.generic import RedirectView

url(r'^source$', RedirectView.as_view(permanent=False, 
                                      url='/dest/')),


1

page_path =在urls.py中定义

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")

0

这应该在大多数版本的Django中都可以使用,我在1.6.5中使用了它:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
urlpatterns = patterns('',
    ....
    url(r'^(?P<location_id>\d+)/$', lambda x, location_id: HttpResponseRedirect(reverse('dailyreport_location', args=[location_id])), name='location_stats_redirect'),
    ....
)

使用此解决方案,您仍然可以使用url模式的名称,而不是硬编码的url。网址中的location_id参数向下传递给lambda函数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.