Python + Django 页面重定向

如何在 Django 中完成简单的重定向(例如 ColdFusion 中的 cflocation或 PHP 中的 header(location:http://)) ?

148718 次浏览

很简单:

from django.http import HttpResponseRedirect


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

更多信息在 姜戈官方文件

更新: Django 1.0

现在在 Django 中使用 generic views显然有一种更好的方法来实现这一点。

例子-

from django.views.generic.simple import redirect_to


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


#etc...
)

通用视图文档中还有更多。 信用证 -Carles Barrobés

更新 # 2: Django 1.3 +

在 Django 1.5中,重定向到已经不存在了,取而代之的是 重定向视图

from django.views.generic import RedirectView


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

实际上有一种比每个重定向都有一个视图更简单的方法——你可以在 urls.py中执行 直接:

from django.http import HttpResponsePermanentRedirect


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

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

由于 Django 1.1,您还可以使用更简单的 再次询问快捷方式:

from django.shortcuts import redirect


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

它还接受一个可选的 forever = True 关键字参数。

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

对于 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 中

您可以在管理部分进行此操作,文档中对此进行了解释。

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

注意,我在一个开发服务器上做了这个,想稍后修改它。

我不得不清空我的缓存来改变它。为了避免将来这种令人头疼的事情发生,我可以把它变成这样的临时性的:

from django.views.generic import RedirectView


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

Page _ path = 在 urls.py 中定义

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

如果您想重定向整个子文件夹,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参数中被替换,如果你的原始路径是 /old/yay/mypath,我们就会得到 /new_path/yay/mypath

如果还想复制查询字符串,也可以执行 ….as_view(url='…', query_string=True)

这应该可以在大多数版本的 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。Url 中的 location _ id 参数传递给 lambda 函数。