1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Djangoでログイン必須サイトにする方法

Last updated at Posted at 2024-02-26

Djangoですべてのページにおいてログインをしていなければログインページにリダイレクトする方法を紹介します。

※ これは2019/7/19に個人ブログで公開した記事を移植し、CC0-1.0で提供しています。情報は古い可能性があります。

標準ではデコレータを使用する

公式ドキュメントによれば、ビュー層のデコレーターを使用すれば実装が可能です。

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    # ...

しかし、これをすべてのビューに実装するのは手間ですし、1ページでも実装を忘れてしまったら大変なことになります。

ミドルウェアの追加

下記を参考に、ミドルウェア(プラグインのようなもの)を追加し、対処します。リクエストを受けた段階でログイン済みか判定し、ログインしていなければリダイレクトするミドルウェアを追加します。

例えば /app/middleware/auth.py にミドルウェアのPythonファイルを作成します。リダイレクトループを防ぐため、ログインのURL/login/ にアクセスされた場合はログインしていない場合もリダイレクトしません。

from django.http import HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin

class authMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        if not request.user.is_authenticated and request.path != '/login/':
            return HttpResponseRedirect('/login/')
        return response

setting.py を編集

setting.pyMIDDLEWARE 変数に今回追加したミドルウェアを追加します。

MIDDLEWARE = [
    'app.middleware.auth.authMiddleware',
]

動作の様子

ログインしていなければ次のとおりログイン画面にリダイレクトされます。

HTTP レスポンスヘッダーに /login/ へのリダイレクトが含まれている

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?