Djangoで単純なリダイレクト(ColdFusionではcflocation
、PHPではheader(location:http://)
など)を実現するにはどうすればよいですか?
それは簡単です:
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/')),
)
目的に応じて(つまり、追加の前処理を行いたくない場合)、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/')),
)
実際には、リダイレクトごとにビューを持つよりも簡単な方法があります-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キーワード引数を取ります。
サブフォルダー全体をリダイレクトする場合は、 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)
を実行することもできます。
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パラメーターは、ラムダ関数に渡されます。