Python + Django页面redirect

如何在Django中完成一个简单的redirect(例如ColdFusion中的cflocation ,或PHP中的header(location:http://) )?

这很简单:

 from django.http import HttpResponseRedirect def myview(request): ... return HttpResponseRedirect("/path/") 

更多信息在正式的Django文档

更新:Django 1.0

现在使用generic views显然是在Django中做的更好的方法。

示例 –

 from django.views.generic.simple import redirect_to urlpatterns = patterns('', (r'^one/$', redirect_to, {'url': '/another/'}), #etc... ) 

通用视图文档中还有更多。 信贷 – CarlesBarrobé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/')), ) 

根据你的需要(即,如果你不想做任何额外的预处理),使用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/')), ) 

实际上比每个redirect都有一个更简单的方法 – 您可以直接urls.py

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

目标可以是可调用的,也可以是string ,这就是我在这里使用的。

由于Django 1.1,你也可以使用更简单的redirect快捷方式:

 from django.shortcuts import redirect def myview(request): return redirect('/path') 

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

如果你想redirect整个子文件夹, 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 。 这个捕获的variables将被replace为你给的url参数,如果你的原始path是/old/yay/mypath ,给我们/new_path/yay/mypath /old/yay/mypath

如果您想复制查询string,也可以执行….as_view(url='…', query_string=True)

使用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中

谨防。 我在一个开发服务器上做了这个,然后想改变它。

  • Firefox 5'caching'301redirect

我不得不清除我的caching来改变它。 为了避免将来发生这种头痛,我可以这样做:

 from django.views.generic import RedirectView url(r'^source$', RedirectView.as_view(permanent=False, url='/dest/')), 

你可以在pipe理部分做到这一点。 这是在文档中解释。

https://docs.djangoproject.com/en/dev/ref/contrib/redirects/

page_path =在urls.py中定义

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

这应该在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模式的名称,而不是使用此解决scheme的硬编码url。 url中的location_idparameter passing给lambda函数。