web-dev-qa-db-ja.com

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

Djangoで単純なリダイレクト(ColdFusionではcflocation、PHPではheader(location:http://)など)を実現するにはどうすればよいですか?

155
Kyle Hayes

それは簡単です:

from Django.http import HttpResponseRedirect

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

official Django docs の詳細情報

更新:Django 1.0

Djangoにgeneric viewsを使用することで、これを行うより良い方法があるようです。

例-

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 に置き換えられました。 ヨナタン へのクレジット

from Django.views.generic import RedirectView

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

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

実際には、リダイレクトごとにビューを持つよりも簡単な方法があります-urls.pyで直接直接できます:

from Django.http import HttpResponsePermanentRedirect

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

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

38
Teddy

Django 1.1以降、より単純な redirect ショートカットを使用することもできます。

from Django.shortcuts import redirect

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

また、オプションのpermanent = Trueキーワード引数を取ります。

26
Kennu

サブフォルダー全体をリダイレクトする場合は、 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)を実行することもできます。

14

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

10
Zlatko

気をつけて。これを開発サーバーで実行し、後で変更したいと考えました。

変更するにはキャッシュをクリアする必要がありました。将来的にこの頭を傷つけないようにするために、次のように一時的にすることができました。

from Django.views.generic import RedirectView

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

page_path = urls.pyで定義

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

これは、管理セクションで実行できます。ドキュメントで説明されています。

https://docs.djangoproject.com/en/dev/ref/contrib/redirects/

1
mcneo

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

0
radtek