2017-08-21 21 views
2

私はDjango(v1.11)プロジェクトに取り組んでおり、のミドルウェア機能をとしてサイトに提供する必要があります。 docsで説明したようにジャンゴのこのバージョンは古いMIDDLEWARE_CLASSES設定を変更します。Django v1.11でミドルウェアクラスを正しく定義する方法は?

A new style of middleware was introduced for use with the new MIDDLEWARE setting.

しかし、私はミドルウェアがをどのように動作するかNEW理解することはできません。ミドルウェアのドキュメントを読んだ後、私は次のような結論に来る:

class FooMiddleware(object): 
    def __init__(self, get_response): 
     self.get_response = get_response 

    def __call__(self, request): 
     return self.get_response(request) 

    def process_template_response(self, request, response): 
     # do something here 
     return response 

私はそれがうまくいくと思ったが、上記残念ながらコードが機能しないと、完全に任意のエラーなしジャンゴ(によって無視され! )。


私は次のように行うと:

class FooMiddleware(object):  
    def process_template_response(self, request, response): 
     # do something here 
     return response 

を(objectクラスの__init__メソッドは、引数を持っていないので)...エラーが発生しました:

TypeError: object() takes no parameters


コードを次のように変更すると、すべてが動作します

from django.utils.deprecation import MiddlewareMixin 

class FooMiddleware(MiddlewareMixin): 
    def process_response(self, request, response): 
     # do something here 
     return response 

しかし、!MiddlewareMixinは、互換性のためにdeprecation utils関連して使用されます。

Django provides django.utils.deprecation.MiddlewareMixin to ease creating middleware classes that are compatible with both MIDDLEWARE and the old MIDDLEWARE_CLASSES .


質問:どのように適切にDjangoのV1.11でのミドルウェアクラスを定義するには?

答えて

3

process_template_responseを定義するのは、レスポンスインスタンスにrender()メソッドがある場合にのみ便利です。そうでない場合は、カスタムコードを__call__メソッドに移動する必要があります。

class FooMiddleware(object): 
    def __init__(self, get_response): 
     self.get_response = get_response 

    def __call__(self, request): 
     response = self.get_response(request) 
     # Do something here 
     return response 
+0

[Alasdair](https://stackoverflow.com/users/113962/alasdair)、ありがとう。私は 'process_template_response'メソッドが古い' process_response'メソッドを置き換えるものだと考えました。 –

関連する問題