Djangoのredirect()の使い方【Python】

153, 2021-01-07

目次

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のリダイレクトはいざという時によく使われます。
覚えておくと損が無い感じですね。

あれもこれもリダイレクト

スポンサーリンク

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク