[英]Python + Django page redirect
如何在Django中完成一個簡單的重定向(例如ColdFusion中的cflocation
,或PHP的header(location:http://)
)?
這很簡單:
from django.http import HttpResponseRedirect
def myview(request):
...
return HttpResponseRedirect("/path/")
有關Django官方文檔的更多信息
更新:Django 1.0
現在使用generic views
顯然有更好的方法在Django中執行此操作。
示例 -
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^one/$', redirect_to, {'url': '/another/'}),
#etc...
)
通用視圖文檔中還有更多內容 。 信用 - 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/')),
)
根據您的需要(即如果您不想進行任何其他預處理),只需使用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')),
)
目標可以是可調用的,也可以是字符串 ,這就是我在這里使用的。
從Django 1.1開始,您還可以使用更簡單的重定向快捷方式:
from django.shortcuts import redirect
def myview(request):
return redirect('/path')
它還需要一個可選的permanent = True關鍵字參數。
如果要重定向整個子文件夾, 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
參數中被替換,如果你的原始路徑是/old/yay/mypath
,則給我們/new_path/yay/mypath
/old/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/')),
page_path =在urls.py中定義
def deletePolls(request):
pollId = deletePool(request.GET['id'])
return HttpResponseRedirect("/page_path/")
您可以在“管理”部分執行此操作。 它在文檔中解釋。
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。 來自url的location_id參數向下傳遞給lambda函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.