Djangoのredirect()の使い方【Python】
- 作成日: 2021-01-07
- 更新日: 2023-12-24
- カテゴリ: Django
Djangoのredirect()の使い方
PythonのWebフレームワークDjango(ジャンゴ)には、便利な関数がたくさん用意されています。
その中の関数の1つにredirect(リダイレクト)というショートカット関数があります。
この関数を使うことで、特定のビューへのアクセスを別のビューにリダイレクトすることができます。
この記事ではこのredirect()
の使い方を解説します。
具体的には↓を見ていきます。
- リダイレクトとは?
- redirect()の構造
- redirect()の使い方
リダイレクトとは?
そもそも「リダイレクト」とはいったいどういう物でしょうか?
Webにおけるリダイレクトとは、ユーザーがページに訪問したときに、ユーザーを別のページに転送することを指します。
つまりユーザーがAというページに訪れたら、そのままBのページへユーザーを転送してしまうことを言います。
なぜこのようなリダイレクトが必要になるのでしょうか?
理由の1つが、ページの移転、引っ越しです。
サイトのコンテンツが移転した場合、移転前のページへのアクセスを移転先のページに集める必要があります。
そういったときに、リダイレクトを使って集まっているアクセスを移転先のページに移動させます。
このリダイレクトという処理は、Webサーバーが備えている機能です。
そのためWebサーバーの設定ファイルなどを設定する必要がありました。
しかしDjangoではこの機能をフレームワークレベルで使うことが出来ます。
そのため非常に手軽にリダイレクトを行うことが可能です。
redirect()の構造
Djangoのredirect()
関数はdjango.shortcuts
に定義されています。
そのためredirect()
を使用するには↓のようにredirect()
をインポートします。
from django.shortcuts import redirect
redirect()
の構造は↓のようになっています。
redirect(to, *args, permanent=False, **kwargs)
redirect()
は最大で2つの引数と可変長引数、キーワード引数を取ります。
返り値はHttpResponseRedirect
です。このレスポンスをビューからreturn
することでリダイレクトが発生します。
to(第1引数)
リダイレクト先のオブジェクトを指定します。
これは文字列のビュー名、またはパス、またはURL、またはモデルのオブジェクトです。
redirect('my-view-name') # ビュー名
redirect('/my/view/') # パス
redirect('https://example.com/') # URL
obj = MyModel.objects.get(...)
redirect(obj) # オブジェクト
*args(第2引数)
可変長引数です。
この引数はパラメーターの指定に使われます。
例えば↓のような設定のルートがあるとします。
urlpatterns = [
path('articles/<int:pk>/', articles_detail_view, name='blog_articles_detail'),
]
↑のルートはpk
というパラメーターを1つ取ります。
このルートにリダイレクトしたい場合は↓のようにします。
def some_view(request):
return redirect('blog_articles_detail', 3)
↑のようにパラメーターpk
を可変長引数に指定することができます。
permanent(第3引数)
redirect()
はデフォルトで一時的なリダイレクトを発生させます。
永続的なリダイレクトを行いたい場合はこのフラグをTrue
にします。
redirect('my-view-name', permanent=True)
**kwargs(第4引数)
キーワード引数です。
この引数はパラメーターの指定に使われます。
例えば↓のような設定のルートがあるとします。
urlpatterns = [
path('articles/<int:pk>/', articles_detail_view, name='blog_articles_detail'),
]
↑のルートはpk
というパラメーターを1つ取ります。
このルートにリダイレクトしたい場合は↓のようにします。
def some_view(request):
return redirect('blog_articles_detail', pk=3)
↑のようにパラメーターpk
を可変長引数に指定することができます。
返り値
redirect()
の返り値はHttpResponseRedirect
です。
これはDjangoのリダイレクトを発生させるクラスです。
このクラスはdjango.http
に定義されています。
そのため↓のようにすればインポートできます。
from django.http import HttpResponseRedirect
このHttpResponseRedirect
のオブジェクトをビューからreturn
することでリダイレクトが発生します。
そのためredirect()
を使う場合は忘れずにreturn
するようにしましょう。
redirect()
を呼び出しただけではリダイレクトは発生しません。
redirect()の使い方
redirect()
の使用例を紹介します。
ビュー名でリダイレクトする
redirect()
の第1引数にビュー名を指定することでそのビュー名のビューにリダイレクトすることができます。
たとえば↓のようなルート情報があるとして、
urlpatterns = [
path('', home_view, name='bbs_home'),
path('about/', about_view, name='bbs_about'),
]
home_view()
からabout_view()
へのリダイレクトは↓のようにすれば可能です。
def home_view(request):
return redirect('bbs_about')
また、↓のようにパラメーターを持っているルートの場合は、
urlpatterns = [
path('', home_view, name='bbs_home'),
path('about/<str:slug>/', about_view, name='bbs_about'),
]
↓のように可変長引数にパラメーターを指定することができます。
def home_view(request):
return redirect('bbs_about', 'author')
または↓のようにキーワード引数を使うことも出来ます。
def home_view(request):
return redirect('bbs_about', slug='author')
パスでリダイレクトする
redirect()
の第1引数にパスを指定すると、そのパスにリダイレクトすることが出来ます。
たとえば↓のようなルート情報があるとして、
urlpatterns = [
path('', home_view, name='bbs_home'),
path('about/', about_view, name='bbs_about'),
]
home_view()
からabout_view()
へのリダイレクトは↓のようにすれば可能です。
def home_view(request):
return redirect('about/')
パスの場合も可変長引数とキーワード引数にパラメーターを指定することが出来ます。
URLでリダイレクトする
redirect()
の第1引数にURL
を指定すると、そのURLにリダイレクトすることが出来ます。
def home_view(request):
return redirect('https://example.com/')
モデルのオブジェクトでリダイレクトする
redirect()
の第1引数にモデルのオブジェクトを指定すると、redirect()
はリダイレクトの過程でそのオブジェクトのメソッドget_absolute_url()
を呼び出します。
そしてredirect()
はそのget_absolute_url()
の返り値をリダイレクト先として見なします。
たとえば↓のようなモデルがあったとします。
class MyModel(models.Model):
name = models.CharField(max_length=128)
def get_absolute_url(self):
return 'about/'
このモデルを↓のようにredirect()
に指定します。
def home_view(request):
obj = MyModel.objects.create(name='My Model')
return redirect(obj)
するとredirect()
の内部でobj
のメソッドget_absolute_url()
が呼ばれ、結果的にabout/
にリダイレクトされます。
おわりに
Djangoのリダイレクトはいざという時によく使われます。
覚えておくと損が無い感じですね。
🦝 < あれもこれもリダイレクト