【发布时间】:2010-10-06 02:52:03
【问题描述】:
如何在 Django 中完成简单的重定向(例如,ColdFusion 中的 cflocation 或 PHP 中的 header(location:http://))?
【问题讨论】:
标签: python django redirect location
如何在 Django 中完成简单的重定向(例如,ColdFusion 中的 cflocation 或 PHP 中的 header(location:http://))?
【问题讨论】:
标签: python django redirect location
很简单:
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.shortcuts 的redirect?
('^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...
)
有关更多高级示例,请参阅 documentation。
对于 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 通用视图更简单且更具可读性。见卡尔斯回答stackoverflow.com/questions/523356/python-django-page-redirect/…
从 Django 1.1 开始,你也可以使用更简单的redirect 快捷方式:
from django.shortcuts import redirect
def myview(request):
return redirect('/path')
它还需要一个可选的 Permanent=True 关键字参数。
【讨论】:
如果你想重定向整个子文件夹,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<path> 将被输入到RedirectView。然后,此捕获的变量将在您提供的 url 参数中替换,如果您的原始路径是 /old/yay/mypath,则为我们提供 /new_path/yay/mypath。
如果您还想复制查询字符串,也可以使用….as_view(url='…', query_string=True)。
【讨论】:
对于 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 中
【讨论】:
小心。我在开发服务器上做了这个,以后想改变它。
我必须清除我的缓存才能更改它。为了避免以后这种令人头疼的事情,我可以像这样暂时将其设置为:
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/
【讨论】:
page_path = 在 urls.py 中定义
def deletePolls(request):
pollId = deletePool(request.GET['id'])
return HttpResponseRedirect("/page_path/")
【讨论】:
这应该适用于大多数版本的 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 函数。
【讨论】: