Python + Django 页面重定向
Posted
技术标签:
【中文标题】Python + Django 页面重定向【英文标题】:Python + Django page redirect 【发布时间】:2010-10-06 02:52:03 【问题描述】:如何在 Django 中完成简单的重定向(例如,ColdFusion 中的 cflocation
或 php 中的 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.shortcuts
的redirect
?
我用('^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根据你想要的(即如果你不想做任何额外的预处理),使用 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<path>
将被输入到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 页面重定向的主要内容,如果未能解决你的问题,请参考以下文章