Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add django-required-login #12

Merged
merged 4 commits into from
Feb 26, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)