Python + Django页面重定向

Kyl*_*yes 155 python django redirect location

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

Bai*_*ose 244

这很简单:

from django.http import HttpResponseRedirect

def myview(request):
    ...
    return HttpResponseRedirect("/path/")
Run Code Online (Sandbox Code Playgroud)

有关Django官方文档的更多信息

更新:Django 1.0

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

示例 -

from django.views.generic.simple import redirect_to

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

    #etc...
)
Run Code Online (Sandbox Code Playgroud)

通用视图文档中还有更多内容.信用 - 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/')),
)
Run Code Online (Sandbox Code Playgroud)

  • 这不再是Django 1.0的最佳方法.看到这个答案:http://stackoverflow.com/questions/523356/python-django-page-redirect/3841632#3841632 (8认同)
  • 从Django 1.5开始,这已经被弃用了.请改用"RedirectView":https://docs.djangoproject.com/en/1.5/ref/class-based-views/base/#redirectview (5认同)
  • 我用`('^ pattern/$',lambda x:redirect('/ redirect/url /'))` (4认同)
  • 为什么不使用`django.shortcuts`中的`redirect`? (2认同)

Car*_*bés 113

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

from django.views.generic.simple import redirect_to

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

    #etc...
)
Run Code Online (Sandbox Code Playgroud)

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


对于Django 1.3+使用:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)
Run Code Online (Sandbox Code Playgroud)


Ted*_*ddy 38

实际上,每个重定向都有一个简单的方法 - 您可以直接urls.py以下位置执行此操作:

from django.http import HttpResponsePermanentRedirect

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

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

  • 没错,但是使用django附带的`redirect_to`泛型视图仍然更简单,更易读.请参阅Carles回答http://stackoverflow.com/questions/523356/python-django-page-redirect/3841632#3841632 (2认同)

Ken*_*nnu 26

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

from django.shortcuts import redirect

def myview(request):
    return redirect('/path')
Run Code Online (Sandbox Code Playgroud)

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


odi*_*ont 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')),
]
Run Code Online (Sandbox Code Playgroud)

?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'),
)
Run Code Online (Sandbox Code Playgroud)

此示例位于urls.py中


Gri*_*ave 6

谨防.我在开发服务器上执行此操作,并希望稍后更改它.

我不得不清除我的缓存来改变它.为了避免将来发生这种令人头疼的问题,我能够像以下那样暂时做到:

from django.views.generic import RedirectView

url(r'^source$', RedirectView.as_view(permanent=False, 
                                      url='/dest/')),
Run Code Online (Sandbox Code Playgroud)