Python + Django 页面重定向

Posted

技术标签:

【中文标题】Python + Django 页面重定向【英文标题】:Python + Django page redirect 【发布时间】:2010-10-06 02:52:03 【问题描述】:

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

【问题讨论】:

【参考方案1】:

很简单:

from django.http import HttpResponseRedirect

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

更多信息在official Django docs

更新:Django 1.0

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

例子-

from django.views.generic.simple import redirect_to

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

    #etc...
)

generic views documentation 中还有更多内容。 信用 - Carles 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/')),
)

【讨论】:

这不再是 Django 1.0 的最佳方法。看到这个答案:***.com/questions/523356/python-django-page-redirect/… 为什么不使用来自django.shortcutsredirect 我用('^pattern/$', lambda x: redirect('/redirect/url/')) 从 Django 1.5 开始,这已经被弃用了。改用“RedirectView”:docs.djangoproject.com/en/1.5/ref/class-based-views/base/… 它实际上并没有被弃用,你说什么被弃用了?重定向?使用这种方法我不知道如何将参数的值传递给 lambda,即 url(r'^(?P\d+)/$', lambda x: HttpResponseRedirect(reverse('dailyreport_location', args= ['%(location_id)', ]))) 不起作用【参考方案2】:

根据你想要的(即如果你不想做任何额外的预处理),使用 Django 的redirect_to 通用视图会更简单:

from django.views.generic.simple import redirect_to

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

    #etc...
)

有关更多高级示例,请参阅 documentation。


对于 Django 1.3+ 使用:

from django.views.generic import RedirectView

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

【讨论】:

+1 用于使用通用视图,而不是在(当前)投票最多的答案中实现您自己的(无论多么简单)。 如果您确实想要进行额外的预处理,有没有人有任何示例? 然后我建议要么编写一个自定义视图来进行处理,然后调用通用视图,要么编写一个装饰器,例如pre_process 并装饰通用视图: (r'^one/$', pre_process(redirect_to), 'url': '/another/') @niallsco:如果你想做额外的处理,那么最好使用Kennu在here中描述的重定向快捷方式 在 django 1.4 中,导入 redirect_to 会给出弃用警告。【参考方案3】:

实际上有一种比为每个重定向查看视图更简单的方法 - 您可以在urls.py直接完成它:

from django.http import HttpResponsePermanentRedirect

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

A target can be a callable as well as a string,这是我在这里使用的。

【讨论】:

是的,但是使用 django 附带的redirect_to 通用视图更简单且更具可读性。见卡尔斯回答***.com/questions/523356/python-django-page-redirect/…【参考方案4】:

从 Django 1.1 开始,你也可以使用更简单的redirect 快捷方式:

from django.shortcuts import redirect

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

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

【讨论】:

【参考方案5】:

如果你想重定向整个子文件夹,RedirectView is actually interpolated 中的 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&lt;path&gt; 将被输入到RedirectView。然后,此捕获的变量将在您提供的 url 参数中替换,如果您的原始路径是 /old/yay/mypath,则为我们提供 /new_path/yay/mypath

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

小心。我在开发服务器上做了这个,以后想改变它。

Firefox 5 'caching' 301 redirects

我必须清除我的缓存才能更改它。为了避免以后这种令人头疼的事情,我可以像这样暂时将其设置为:

from django.views.generic import RedirectView

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

虽然与我的问题不太相关,但这仍然是一条有趣的信息。【参考方案9】:

page_path = 在 urls.py 中定义

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

【讨论】:

【参考方案10】:

这应该适用于大多数版本的 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 函数。

【讨论】:

以上是关于Python + Django 页面重定向的主要内容,如果未能解决你的问题,请参考以下文章

django 将“/”重定向到平面页面

带有预处理的 Django 页面重定向

Django 自动注销和页面重定向

开始页面上的 Django 注册表单,没有重定向到登录页面

Django页面重定向

django 重定向