Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Djangoでrequest情報をどこからでも参照できるようにする

More than 1 year has passed since last update.

requestされたurlのパスに応じて、データベースの振る舞いであったりコアな部分の挙動を少し変えたい……ということがあったので。
reqeust情報をこの関数まで持ってくるのが辛いな、ということがあったので、
あまり良い実装ではなさそうなんですが、どこからでも参照できるようにしてみました。

実装例

Djangoのミドルウェアを新規に追加して、
そのミドルウェアの中でrequest情報を保存、参照できるようにしました。
ミドルウェアについては下を参照で。

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

import threading

GLOBAL_REQUEST_CONTEXT = threading.local()

def custom_middleware(get_response):
    def middleware(request):
        GLOBAL_REQUEST_CONTEXT.request = request
        return get_response(request)

    return middleware

def get_request():
    try:
        return GLOBAL_REQUEST_CONTEXT.request
    except AttributeError:
        return None

やっていることは超単純なんですが、キモはthreading.local()です。
これを設定してあげないと、リクエストを受けた際に各ユーザごとの情報が入り乱れてしまうので😭
ここまで実装できたら、後はget_request() をrequest情報が欲しいところで呼んであげればOKです!

最後に

株式会社ネコカリでは猫の手も借りたい🔥炎上中🔥なお仕事を募集しています!
一緒に働くメンバーも募集していますので、よかったら是非!

fumihiko-hidaka
株式会社ネコカリという会社をやってます。 お客さんの困ったをどう捌いていくか、というのが好きなので受託開発メインです。 好きなクラウド環境はGCPです。 Googleいいよね。
https://www.nekokari.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away