簡體   English   中英

Python + Django頁面重定向

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM