ミドルウェア - Django

関数型のミドルウェアの追加

関数型のミドルを追加するには次のようにします。

pythonApp\env\django_app\django_app\settings.py

MIDDLEWARE = [
    ...
    'hello.views.sample_middleware',
]

pythonApp\env\django_app\hello\views.py

from django.shortcuts import render
from django.views.generic import TemplateView

from .forms import SessionForm

# Create your views here.
class HelloView(TemplateView):
  
  def __init__(self):
    self.params = {}
  
  def get(self, request):
    return render(request, 'hello/index.html')

def sample_middleware(get_response):
  print("サーバーが立ち上がりました")
  def middleware(request):
    response = get_response(request)
    print("ミドルウェアが読み込まれました")
    return response
  return middleware

pythonApp\env\django_app\hello\templates\hello\index.html

{% load static %}
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="{% static 'hello/css/style.css' %}">
  <title>Document</title>
</head>
<body>
  <h1>hello/index</h1>
</body>
</html>

ミドルウェア用のディレクトリを作る

  • pythonApp
    • env
      • django_app
        • django_app
          • __pycache__
          • __init__.py
          • asgi.py
          • settings.py
          • urls.py
          • wsgi.py
        • hello
          • migrations
            • ...
          • __init__.py
          • admin.py
          • apps.py
          • models.py
          • tests.py
          • views.py
        • middleware
          • middleware.py
        • db.sqlite3
        • manage.py
      • include
      • Lib
      • Scripts
      • pyenv.cfg

関数ベースのミドルウェアの作成

pythonApp\env\django_app\middleware\middleware.py

def sample_middleware(get_response):
  print("サーバーが立ち上がりました")
  def middleware(request):
    response = get_response(request)
    print("ミドルウェアが読み込まれました")
    return response
  return middleware

pythonApp\env\django_app\django_app\settings.py

MIDDLEWARE = [
    ...
    'middleware.middleware.sample_middleware',
]

クラスベースのミドルウェアの作成

pythonApp\env\django_app\middleware\middleware.py

class SampleMiddleware:
  def __init__(self, get_response):
    self.get_response = get_response
    print('サーバー起動時のみ')

  def __call__(self, request):
    # リクエストの処理前にしたい処理を記述
    print('リクエストが views.py で処理される前')

    response = self.get_response(request)

    # リクエストの処理後にしたい処理を記述
    print('リクエストが views.py で処理された後')

    return response

pythonApp\env\django_app\django_app\settings.py

MIDDLEWARE = [
    ...
    'middleware.middleware.SampleMiddleware',
]

_init__メソッドはサーバー起動時に一度だけ呼ばれ、__call__メソッドはリクエストのたびに実行されます。

views.py に値を渡す

pythonApp\routing\learn_routing\middleware\middleware.py

class SampleMiddleware:
  def __init__(self, get_response):
    self.get_response = get_response
    print('サーバー起動時のみ')

  def __call__(self, request):
    response = self.get_response(request)
    return response
  
  def process_view(self, request, view_func, view_args, view_kwargs):
    view_kwargs["hello"] = 'hello, world'

pythonApp\routing\learn_routing\first\views.py

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def index(request, **kwargs):
  params = {
    'hello': kwargs["hello"],
  }
  return render(request, 'first/index.html', params)

pythonApp\routing\learn_routing\first\templates\first\index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h1>first/index</h1>
  <p>{{ hello }}</p>
  <p><a href="{% url 'next:index' %}">index</a></p>
</body>
</html>