python - httpresponseredirect - django reverse用法



Python+Django頁面重定向 (7)

我如何在Django中完成一個簡單的重定向(例如ColdFusion中的cflocation ,或PHP中的header(location:http://) )?


page_path =在urls.py中定義

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

使用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中


如果你想重定向整個子文件夾, 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)


實際上,比每個重定向都有一個更簡單的方式 - 您可以直接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,你也可以使用更簡單的redirect快捷方式:

from django.shortcuts import redirect

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

它也需要一個可選的permanent = True關鍵字參數。


謹防。 我在開發服務器上完成了這項工作,並希望稍後再進行更改。

我不得不清除我的緩存來改變它。 為了避免將來發生這種頭部搔抓,我可以像這樣臨時性地做到這一點:

from django.views.generic import RedirectView

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

這應該在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函數。





location