Djangoでレスポンスを返すまでにかかった所要時間を測定する方法(middlewareの活用)

2022年1月14日Djangoの豆知識ミドルウェア

Djangoのmiddlewareで測定できそう。

「Djangoのレスポンスが早いのか遅いのかなんとなくわかるけど正確な秒数を知りたい。」という時はよくあると思います。そんなときにサクッと秒数を測定できるミドルウェアを作ってみましょう。

middlewareにピンとこない場合は「Djangoでmiddlewareを自作する方法」をご覧ください!

djangoのmiddlewareとはざっくり、「リクエストを受けてviews.pyが処理する前や後になにか処理をするもの」です。

サンプルコード

Githubにあります。

またはターミナルで

git clone -b  django_time_middleware https://github.com/yeconnect/django-baby-starter-template.git

cd django-baby-starter-template

docker compose up

とし、ブラウザで http://localhost:4989/todo/ にアクセス

バージョン

python 3.9

Django==3.2

コードの書き方

まずはルートにmiddlewareディレクトリを作成します。

その中に__init__.pyとmeasure_time.pyを作り、measure_time.pyを以下のように書きます。(__init__.pyを忘れず作成してください)

import time

class ResponseTimeMeasureMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        start = time.time()

        response = self.get_response(request)

        end = time.time()
        print(f'レスポンスまでの所要時間:{(end-start)*1000}ミリ秒')

        return response

これで所要時間を測定しprintするミドルウェアが定義できたのでsettings.pyで読み込みます。

# ↑略

MIDDLEWARE = [
    'middleware.measure_time.ResponseTimeMeasureMiddleware', # ここ!
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# ↓略

middlewareの実行される順番は、MIDDLEWAREに書く順番で決まるので、一番上に書きましょう。

これだけで完成です!うまくいくと↓のようにターミナルに表示されます。

さらに詳細な測定がしたい場合

ただの所要時間だけでなく、SQLの発行数やかかった時間などを見たい場合があると思います。

その場合はdjango-debug-toolbardjango-silkなどが向いてそうです。また試して見たら記事を書きます。