Python + Djangoページリダイレクト


回答:


250

それは簡単です:

from django.http import HttpResponseRedirect

def myview(request):
    ...
    return HttpResponseRedirect("/path/")

Django公式ドキュメントの詳細

更新:Django 1.0

現在、Djangoでこれを使用するより良い方法があるようですgeneric views

例-

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',   
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

ジェネリックビューのドキュメントには他にもあります。クレジット- カルレスBarrobés

アップデート#2:Django 1.3以降

Django 1.5では、redirect_toは存在せず、RedirectViewに置き換えられました。ヨナタンのクレジット

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

8
これは、Django 1.0以降、最良の方法ではありません。:この回答を参照してくださいstackoverflow.com/questions/523356/python-django-page-redirect/...
ジェイク

2
redirectfrom を使用しないのはなぜdjango.shortcutsですか?
アフシンメフラバ

4
私が使用しています('^pattern/$', lambda x: redirect('/redirect/url/'))
mrmagooey

5
これはDjango 1.5からすでに非推奨です。代わりに使う'RedirectView':docs.djangoproject.com/en/1.5/ref/class-based-views/base/...
Yonatan

実際には非推奨ではありませんが、非推奨とは何ですか?リダイレクト?このメソッドを使用すると、パラメーターの値をラムダに渡す方法がわかりません。つまり、url(r '^(?P <location_id> \ d +)/ $'、lambda x:HttpResponseRedirect(reverse( 'dailyreport_location'、args = ['%(location_id)'、])))は機能しません
radtek

113

必要に応じて(つまり、追加の前処理を実行したくない場合)、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/')),
)

+1は、(現在の)上位投票の回答のように、(単純なものであっても)独自のビューを実装するのではなく、一般的なビューを使用するためのものです。

あなたがあれば誰でものための任意の例を持っていない追加の前処理をしたいですか?
熱心なアナリスト、

1
次に、処理を実行してから汎用ビューを呼び出すカスタムビューを作成するか、デコレータ(例:pre_process)を作成して汎用ビューを装飾します:(r '^ one / $'、pre_process(redirect_to)、{'url ':' / another / '})
CarlesBarrobés

1
@niallsco:追加の処理を実行する場合は、Kennuがここで
Lie Ryan

1
django 1.4では、redirect_toをインポートすると、劣化警告が表示されます。
joctee

38

各リダイレクトのビューを持つより簡単な方法は、実際にあります-あなたはそれを行うことができ、直接urls.py

from django.http import HttpResponsePermanentRedirect

urlpatterns = patterns(
    '',
    # ...normal patterns here...
    (r'^bad-old-link\.php',
     lambda request: HttpResponsePermanentRedirect('/nice-link')),
)

ターゲットは文字列と同様に呼び出し可能にすることができます。これは私がここで使用しているものです。


2
本当redirect_toですが、djangoに付属する一般的なビューを使用する方が、よりシンプルで読みやすくなっています。参照カルレス答えstackoverflow.com/questions/523356/python-django-page-redirect/...

28

Django 1.1以降、より簡単なリダイレクトショートカットを使用することもできます:

from django.shortcuts import redirect

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

また、オプションのpermanent = Trueキーワード引数も使用できます。


14

サブフォルダ全体をリダイレクトする場合urlRedirectViewの引数は実際に補間されるため、次のように実行できます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)クエリ文字列もコピーする場合にも実行できます。


10

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にあります


6

注意してください。私はこれを開発サーバーで行い、後で変更したいと思いました。

それを変更するには、キャッシュをクリアする必要がありました。将来的にこの頭の引っかき傷を回避するために、私はそれを次のように一時的にすることができました:

from django.views.generic import RedirectView

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


1

page_path = urls.pyで定義

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

0

これは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パラメータがラムダ関数に渡されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.