[rtoc_mokuji title="" title_display="" heading="h3" list_h2_type="" list_h3_type="" display="" frame_design="" animation=""]
redirect関数(django.shortcuts.redirect)を用いたリダイレクト
django.shortcuts.redirectを用いて、リダイレクトをすることができる。
以下のように記述する。
response = redirect('/redirect_success/') # https://自身のサイトのホスト/redirect_success/に遷移
print(type(response)) # class 'django.http.response.HttpResponseRedirect'
return response
上のように定義するとredirect_view実行時に、立ち上げているアプリケーションの/redirect_success/ページにリダイレクトすることができる。
実際には以下の例のように定義すればよい。
(URLマッピングについてはこちらを参照)
- プロジェクトのurls.py(URLマッピングを定義)
from django.urls import path
from django.conf.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('app/', include('app.urls')), # /app/でapp.urlsに遷移
]
- アプリのurls.py(URLマッピングを定義)
from app import views
app_name = 'app'
urlpatterns = [
path('redirect_view', views.redirect_view, name='redirect_view'), # /app/redirect_viewの遷移画面
path('redirect_success', views.redirect_success, name='redirect_success'), # /app/redirect_successの遷移画面
]
- Viewの定義
from django.shortcuts import redirect
from django.http import HttpResponse
def redirect_view(request):
response = redirect('/app/redirect_success') # /app/redirect_viewに遷移させる
print(type(response)) # class 'django.http.response.HttpResponseRedirect'
return response
def redirect_success(request):
return HttpResponse("リダイレクト成功")
このようにすると、http://○○○.×××/app/redirect_viewを開いた場合にhttp://○○○.×××/app/redirect_successに遷移される。
ターミナルには、以下のようにHTTPステータスコード302(リダイレクトを表す)のログが出力される。
ちなみに以下のように記述しても同様に遷移させることができる。
- Viewの定義その2
from django.shortcuts import redirect
from django.http import HttpResponse
def redirect_view(request):
response = redirect('app:redirect_success') # 自動で、/app/redirect_viewと解釈され遷移させる
print(type(response)) # class 'django.http.response.HttpResponseRedirect'
return response
def redirect_success(request):
return HttpResponse("リダイレクト成功")
また、自身のアプリケーションの別のViewにリダイレクトするのでなくて、他サイトに遷移させることもできる。
例えば下のようにするとGoogleに遷移させることもできる。
response = redirect('https://google.com')
return response
HttpResopseRedirectを利用したリダイレクト方法
これまで、redirect関数にリダイレクト先の引数を与えてリダイレクトを行ってきた。
redirect関数を用いると、返り値としてdjango.http.response.HttpResponseRedirectが返される。
このdjango.http.HttpResponseRedirectを直接利用してリダイレクトをすることもできる。
以下のよう記述する。
- リダイレクトをviewに記述(URLパターンマッチングは省略)
from django.urls import reverse
def redirect_view(request):
return HttpResponseRedirect('/app/redirect_success') このようにするとredirect_viewから/app/redirect_successにリダイレクトされる
また、reverse関数(django.urls.reverse)を用いると関数名からURLを逆引きすることもできる。
- reverseを用いたリダイレクト(HttpResponseRedirect)
print(reverse('app:redirect_success')) # /app/redirect_success(URLを逆引き)
return HttpResponseRedirect(reverse('app:redirect_success')) # /app/redirect_successにリダイレクト
リダイレクトでパラメータを渡す
パラメータを渡してリダイレクトをするには、redirect関数で、第2, 第3引数に値を指定すればよい。
- urls.pyの記述内容
- views.pyの記述内容1
id = 1
return redirect('product', id=id) # リダイレクト対象のviewを渡すIDを指定する
また、以下のようにしても同様にリダイレクトすることができる。
- views.pyの記述内容2
id = 1
return redirect(f'/product/
また、?id=○○&name=××
のように値を渡して画面遷移する場合もある。
この場合は、以下のようにurlencode(urllib.parse.urlencode)を利用すればよい
- views.pyの記述内容
from urllib.parse import urlencode
def some_view(request):
id=1, category_id=2
query_string = urlencode({'id': id, 'category_id': category_id}) # id=1&category_id=2
url = f'/product_view/?{query_string}' # /products?id=1&category_id=2
return redirect(url)
def product_view(request):
category_id = request.GET.get('category_id') # category_idをリクエストから取得
以上、基本的なリダイレクトの方法について紹介しました。