ジャンゴ-11ミドルウェア

ミドルウェアの最初に、概念

名前が暗示するミドルウェアは、入力の変化と出力ジャンゴグローバル処理要求と応答処理、比較的軽量の間に介在され、。変更はグローバルなので、パフォーマンスに影響します良いと、慎重かつ実用的であることが必要です。
Djangoのミドルウェアの定義:

Middleware is a framework of hooks into Django’s request/response processing. <br>It’s a light, low-level “plugin” system for globally altering Django’s input or output.

あなたが要求を変更したい場合は、例えば、ビュー内のHttpRequestオブジェクトに転送されます。それとも、ミドルウェアを介して達成することができるビューのリターンHttpResponseオブジェクトを、変更したい場合。
また、このような状況が実現するミドルウェアを使用することができ、ビューの実装前に何かをしたいことがあります。
Djangoのデフォルトのミドルウェア:

MIDDLEWARE = [
    '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',
]

各ブローカーは、特定の機能を持っています。

第二に、カスタムミドルウェア

4つの方法の合計でミドルウェア:

process_request
process_view
process_exception
process_response

process一、process_response

ユーザーは、要求が順次すべての中間、process一の要求によって、この時間に行くだろうし、最終的に順次中間を通過し、ビュー、関数のリアビュー機能するために開始すると、この時間はprocess_responseあり、そして最終的に依頼者に返却しました人。

スクリーンショットのDjangoのミドルウェアの上であり、我々はまた、我々はクラスを書くことができ、独自のミドルウェアを定義することができますが、MiddlewareMixinが継承する必要があります
インポートする必要があります

from django.utils.deprecation import MiddlewareMixin

ビューで:

def index(request):

    print("view函数...")
    return HttpResponse("OK")

Mymiddlewares.pyで:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class Md1(MiddlewareMixin):

    def process_request(self,request):
        print("Md1请求")

    def process_response(self,request,response):
        print("Md1返回")
        return response

class Md2(MiddlewareMixin):

    def process_request(self,request):
        print("Md2请求")
        #return HttpResponse("Md2中断")
    def process_response(self,request,response):
        print("Md2返回")
        return response

結果:

Md1请求
Md2请求
view函数...
Md2返回
Md1返回

注:次のように要求が要求条件が直接リターンを満たしていない2に達するとした場合、つまりはHttpResponseを返す(「MD2割り込み」)は、プログラムが中間部2に直接リクエストを返し、その後、順番に要求元に戻りますが、結果は以下のとおりです。

次のようにMD2は、改ページ、バックグラウンド印刷を返します。

Md1请求  
Md2请求  
Md2返回  
Md1返回

このフローチャートは以下のようです:

process_view

process_view(self, request, callback, callback_args, callback_kwargs)

次のようにMymiddlewares.pyが改正しました

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class Md1(MiddlewareMixin):
    def process_request(self,request):
        print("Md1请求")
        #return HttpResponse("Md1中断")
    def process_response(self,request,response):
        print("Md1返回")
        return response
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("Md1view")
class Md2(MiddlewareMixin):
    def process_request(self,request):
        print("Md2请求")
        return HttpResponse("Md2中断")
    def process_response(self,request,response):
        print("Md2返回")
        return response
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("Md2view")

結果は以下の通りであります:

Md1请求
Md2请求
Md1view
Md2view
view函数...
Md2返回
Md1返回

図は、上記の手順を分析しました。

当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户。
process_view可以用来调用视图函数:

class Md1(MiddlewareMixin):
    def process_request(self,request):
        print("Md1请求")
        #return HttpResponse("Md1中断")
    def process_response(self,request,response):
        print("Md1返回")
        return response
    def process_view(self, request, callback, callback_args, callback_kwargs):
        # return HttpResponse("hello")
        response=callback(request,*callback_args,**callback_kwargs)
        return response

结果如下:

Md1请求
Md2请求
view函数...
Md2返回
Md1返回

注意:process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行。

process_exception

process_exception(self, request, exception)

示例修改如下:

class Md1(MiddlewareMixin):

    def process_request(self,request):
        print("Md1请求")
        #return HttpResponse("Md1中断")
    def process_response(self,request,response):
        print("Md1返回")
        return response
    def process_view(self, request, callback, callback_args, callback_kwargs):
        # return HttpResponse("hello")
        # response=callback(request,*callback_args,**callback_kwargs)
        # return response
        print("md1 process_view...")
    def process_exception(self):
        print("md1 process_exception...")
class Md2(MiddlewareMixin):
    def process_request(self,request):
        print("Md2请求")
        # return HttpResponse("Md2中断")
    def process_response(self,request,response):
        print("Md2返回")
        return response
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("md2 process_view...")
    def process_exception(self):
        print("md1 process_exception...")

结果如下:

Md1请求
Md2请求
md1 process_view...
md2 process_view...
view函数...

Md2返回
Md1返回

流程图如下:

当views出现错误时:

将md2的process_exception修改如下:

def process_exception(self,request,exception):

      print("md2 process_exception...")
      return HttpResponse("error")

结果如下:

Md1请求
Md2请求
md1 process_view...
md2 process_view...
view函数...
md2 process_exception...
Md2返回
Md1返回

おすすめ

転載: www.cnblogs.com/sunny666/p/11626753.html