ユーニックス総合研究所

  • home
  • archives
  • django-redirect

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

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