如何在Django中完成简单的重定向(例如,cflocation
在ColdFusion中或header(location:http://)
对于PHP)?
如何在Django中完成简单的重定向(例如,cflocation
在ColdFusion中或header(location:http://)
对于PHP)?
Answers:
这很简单:
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
官方Django文档中的更多信息
更新:Django 1.0
显然,现在使用,在Django中有一种更好的方法generic views
。
范例-
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
更新#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/')),
)
redirect
from django.shortcuts
?
('^pattern/$', lambda x: redirect('/redirect/url/'))
根据您的需要(即,如果您不想进行任何其他预处理),仅使用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/')),
)
实际上,有一个比为每个重定向查看都有更简单的方法-您可以直接在中执行此操作urls.py
:
from django.http import HttpResponsePermanentRedirect
urlpatterns = patterns(
'',
# ...normal patterns here...
(r'^bad-old-link\.php',
lambda request: HttpResponsePermanentRedirect('/nice-link')),
)
目标既可以是可调用的,也可以是字符串,这是我在这里使用的。
redirect_to
django随附的通用视图仍然更加简单且可读性强。见普约尔答案stackoverflow.com/questions/523356/python-django-page-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
。然后,该捕获的变量将替换为url
您提供的参数,/new_path/yay/mypath
如果您的原始路径为,则会给我们/old/yay/mypath
。
….as_view(url='…', query_string=True)
如果您也想复制查询字符串,也可以这样做。
谨防。我在开发服务器上进行了此操作,并希望稍后进行更改。
我必须清除缓存以进行更改。为了避免将来出现这种令人头疼的问题,我可以将其设置为临时状态,如下所示:
from django.views.generic import RedirectView
url(r'^source$', RedirectView.as_view(permanent=False,
url='/dest/')),
您可以在“管理员”部分中执行此操作。在文档中对其进行了说明。
https://docs.djangoproject.com/en/dev/ref/contrib/redirects/
这应该在大多数版本的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。网址中的location_id参数向下传递给lambda函数。