Skip to content

Commit

Permalink
feat: Add django-required-login (#12)
Browse files Browse the repository at this point in the history
  • Loading branch information
bicstone committed Feb 26, 2024
1 parent b522977 commit 805c589
Showing 1 changed file with 69 additions and 0 deletions.
69 changes: 69 additions & 0 deletions public/django-required-login.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
---
title: Djangoでログイン必須サイトにする方法
tags:
- "Programming"
- "Python"
- "django"
- 認証
private: false
updated_at: ""
id: null
organization_url_name: null
slide: false
ignorePublish: false
---

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

※ これは2019/7/19に個人ブログで公開した記事を移植したものです。

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

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

https://docs.djangoproject.com/ja/2.2/topics/auth/default/#the-login-required-decorator

```py
from django.contrib.auth.decorators import login_required

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

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

## ミドルウェアの追加

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

https://docs.djangoproject.com/ja/2.2/topics/http/middleware/

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

```py
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.py``MIDDLEWARE` 変数に今回追加したミドルウェアを追加します。

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

## 動作の様子

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

![HTTP レスポンスヘッダーに `/login/` へのリダイレクトが含まれている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/452d29cf-bb0e-2fd8-0c5e-9a7b083ce16e.png)

0 comments on commit 805c589

Please sign in to comment.