Djangoグローバルrequestの取得

895 ワード

一.問題の説明
いくつかのシナリオでは、任意の関数内でrequestを取得する必要がありますが、djangoはグローバルrequestを取得する方法を提供していません.
 
二.解決策
requestがビュー関数に到達する前に、ミドルウェアによってブロックされます.私たちは自分でミドルウェアを書いて、単例モードに設計することができます.次に、ミドルウェアで現在のrequestオブジェクトを取得し、ミドルウェアオブジェクトに保存します.
 
三.コード実装
middleware.py:
from django.utils.deprecation import MiddlewareMixin


class GlobalRequestMiddleware(MiddlewareMixin):
    # TODO:   ,    
    __instance = None

    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def process_request(self, request):
        GlobalRequestMiddleware.__instance = request

    @classmethod
    def getRequest(cls):
        return cls.__instance

settingsにミドルウェアを登録することを忘れないでください.
呼び出し:
currentRequest = GlobalRequestMiddleware.getRequest()