Python+;Django页面重定向

Python+;Django页面重定向,python,django,redirect,location,Python,Django,Redirect,Location,如何实现简单的重定向(例如ColdFusion中的cflocation,或Django中的头(位置:http://)(对于PHP)?很简单: from django.http import HttpResponseRedirect def myview(request): ... return HttpResponseRedirect("/path/") 更多信息请访问 更新:Django 1.0 在Django中,现在显然有一种更好的方法可以使用generic view 范

如何实现简单的重定向(例如ColdFusion中的
cflocation
,或Django中的
头(位置:http://)
(对于PHP)?

很简单:

from django.http import HttpResponseRedirect

def myview(request):
    ...
    return HttpResponseRedirect("/path/")
更多信息请访问

更新:Django 1.0

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

范例-

from django.views.generic.simple import redirect_to

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

    #etc...
)
未来还有更多。 信用-

更新#2:Django 1.3+

在Django 1.5中,重定向到不再存在,已被替换为。归功于


实际上,有一种比为每个重定向创建一个视图更简单的方法-您可以直接在
url.py
中执行此操作:

from django.http import HttpResponsePermanentRedirect

urlpatterns = patterns(
    '',
    # ...normal patterns here...
    (r'^bad-old-link\.php',
     lambda request: HttpResponsePermanentRedirect('/nice-link')),
)
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')),
]

,这就是我在这里使用的。

自Django 1.1以来,您还可以使用更简单的快捷方式:

from django.shortcuts import redirect

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

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

根据您的需要(即,如果您不想做任何额外的预处理),只需使用Django的
重定向\u到
通用视图即可:

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'),
)

此示例位于url.py中,您可以在管理部分执行此操作。文档中对此进行了解释

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

要当心。我在一个开发服务器上做了这项工作,并希望以后对其进行更改

我必须清除缓存才能更改它。为了避免将来出现这种头痛的情况,我可以将其暂时化,如下所示:

from django.views.generic import RedirectView

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

page_path=在url.py中定义

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

如果要重定向整个子文件夹,请单击中的
url
参数,以便在
url.py
中执行类似操作:

from django.http import HttpResponsePermanentRedirect

urlpatterns = patterns(
    '',
    # ...normal patterns here...
    (r'^bad-old-link\.php',
     lambda request: HttpResponsePermanentRedirect('/nice-link')),
)
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')),
]
从django.conf.url.defaults导入url
从django.views.generic导入重定向视图
URL模式=[
url(r'^old/(?P.*)$,重定向视图。作为_视图(url='/new_path/%(path)s')),
]

您捕获的
?p
将被送入
重定向视图
。然后将在您给出的
url
参数中替换此捕获的变量,如果原始路径为
/old/yay/mypath
,则为我们提供
/new\u 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'),
    ....
)
从django.core.urlResolver反向导入
从django.http导入HttpResponseRedirect
urlpatterns=模式(“”,
....
url(r'^(?P\d+/$),lambda x,location\u id:HttpResponseRedirect(反向('dailreport\u location',args=[location\u id])),name='location\u stats\u redirect',
....
)

在这个解决方案中,您仍然可以使用url模式的名称,而不是硬编码的url。url中的location_id参数被传递给lambda函数。

+1用于使用通用视图,而不是像(当前)中那样实现自己的视图(无论多么简单)得票最多的答案。如果你想做额外的预处理,有人有任何例子吗?那么我建议要么写一个进行处理的自定义视图,然后调用泛型视图,要么写一个装饰器,例如pre_进程和装饰泛型视图:(r'^one/$,pre_进程(重定向到),{'url':'/other/'})@niallsco:如果你想做额外的处理,那么最好使用Kennu在django 1.4中所描述的重定向快捷方式,导入redirect_将给出一个depracation警告。是的,但是使用django附带的
redirect_to
通用视图更简单,可读性更强。参见Carles的回答:从Django 1.0开始,这不再是最好的方法。查看此答案:为什么不使用来自
django.shortcuts的
redirect
?我使用
(“^pattern/$”,lambda x:redirect(“/redirect/url/”)
这在django 1.5中已经被弃用了。改用“RedirectView”:它实际上没有被弃用,你说什么是弃用的?重新使用使用这种方法,我不知道如何将参数的值传递给lambda,即url(r'^(?P\d+/$),lambda x:HttpResponseRedirect(reverse('dailyreport_location',args=['%(location_id'),])不起作用,尽管与我的问题不太相关,但这仍然是一条有趣的信息。