2016-05-31 12 views
1

djangoミドルウェアでprocess_requestとprocess_response関数を使用して、ビューセットを起動する前にリクエストを記録しました。しかし、私は内部サーバーエラーを取得します。自分のコードに何が問題なのか分かりません。ContentNotRenderedError djangoミドルウェア使用中

class MyMiddleware(): 
    def process_request(self, request): 
     print "xxxxx" 
     return Response(status=status.HTTP_200_OK) 
    def process_response(self, request, response): 
     print "xxxxx" 
     return Response(status=status.HTTP_200_OK) 

何が欠けていますか? エラーは、問題があなたのミドルウェア方法でreturn Response()ある

Traceback (most recent call last): 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 86, in run 
    self.finish_response() 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 127, in finish_response 
    for data in self.result: 
    File "/usr/local/lib/python2.7/dist-packages/django/template/response.py", line 118, in __iter__ 
    raise ContentNotRenderedError('The response content must be ' 
ContentNotRenderedError: The response content must be rendered before it can be iterated over. 

---------------------------------------- 

Traceback (most recent call last): 
    File "/usr/lib/python2.7/SocketServer.py", line 593, in process_request_thread 
    self.finish_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/servers/basehttp.py", line 126, in __init__ 
    super(WSGIRequestHandler, self).__init__(*args, **kwargs) 
    File "/usr/lib/python2.7/SocketServer.py", line 649, in __init__ 
    self.handle() 
    File "/usr/lib/python2.7/wsgiref/simple_server.py", line 124, in handle 
    handler.run(self.server.get_app()) 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 92, in run 
    self.close() 
    File "/usr/lib/python2.7/wsgiref/simple_server.py", line 33, in close 
    self.status.split(' ',1)[0], self.bytes_sent 
AttributeError: 'NoneType' object has no attribute 'split' 
---------------------------------------- 

Traceback (most recent call last): 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 86, in run 
    self.finish_response() 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 127, in finish_response 
    for data in self.result: 
    File "/usr/local/lib/python2.7/dist-packages/django/template/response.py", line 118, in __iter__ 
    raise ContentNotRenderedError('The response content must be ' 
ContentNotRenderedError: The response content must be rendered before it can be iterated over. 

---------------------------------------- 

Traceback (most recent call last): 
    File "/usr/lib/python2.7/SocketServer.py", line 593, in process_request_thread 
    self.finish_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/servers/basehttp.py", line 126, in __init__ 
    super(WSGIRequestHandler, self).__init__(*args, **kwargs) 
    File "/usr/lib/python2.7/SocketServer.py", line 649, in __init__ 
    self.handle() 
    File "/usr/lib/python2.7/wsgiref/simple_server.py", line 124, in handle 
    handler.run(self.server.get_app()) 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 92, in run 
    self.close() 
    File "/usr/lib/python2.7/wsgiref/simple_server.py", line 33, in close 
    self.status.split(' ',1)[0], self.bytes_sent 
AttributeError: 'NoneType' object has no attribute 'split' 
---------------------------------------- 
+0

どのサーバーを使用していますか?どのようなPythonのバージョン? – FlipperPA

+2

@linuxfreakエラーメッセージは何ですか?質問に追加してください。 – rtindru

+0

私は質問にエラーを追加しました – linuxfreak

答えて

2

です。

process_requestメソッドで応答を返すと、Djangoはビューを呼び出しません。あなたはおそらくここで何かを返すことを望んでいないでしょう。

process_responseメソッドからの応答を返す必要があります。ビュー(response)から元の応答を返すことをお勧めします。別の応答(たとえばResponse(...))を返すと、Djangoはビューからの応答ではなく、これをユーザーに返します。

class MyMiddleware(): 
    def process_request(self, request): 
     print "xxxxx" 

    def process_response(self, request, response): 
     print "xxxxx" 
     return response 

各ミドルウェアメソッドから返される情報の詳細については、Djangoドキュメントを参照してください。

+0

djangoのドキュメントに従って、process_requestとprocess_responseの両方からResponseオブジェクトを返すことができます。とにかく、あなたが言ったようにprocess_requestから戻らないようにしました。次のエラーが発生しました: – linuxfreak

+0

ファイル "/usr/lib/python2.7/wsgiref/simple_server.py"、33行目を閉じてください self.status.split 、1)[0]、self.bytes_sent はAttributeError: 'NoneType' オブジェクトが オリジナル例外で呼び出すことはできません: トレースバック(最新の呼び出しの最後): 'NoneType' オブジェクトには属性が 'スプリットない' TypeError例外ありファイル "/usr/local/lib/python2.7/dist-packages/django/utils/autoreload.py"、96行目、ラッパー et、ev、tb = sys.exc_info() AttributeError: 'NoneType'オブジェクト'exc_info'属性がありません – linuxfreak

+0

はい、Djangoのドキュメントはあなたが '' Response'オブジェクトを返すことができると言っていますf rom process_request'ですが、これは、Djangoがビューを処理する代わりにその応答をユーザに返すことを意味します。ミドルウェアがミドルウェアからの応答を返す場合は、ビューを持つことに意味はありません。同様に、 'process_response'から' Response(...) 'を返すと、Djangoはビューからの応答ではなくその応答を返します。 – Alasdair

1

問題を修正しました。これは、process_responseによって返された応答オブジェクトが実際の応答を持たないためです。私はそれを次のように変更し、それはうまくいった。

class MyMiddleware(): 
    def process_request(self, request): 
     print "xxxxx" 
     return None 
    def process_response(self, request, response): 
     print "xxxxx" 
     return response 
関連する問題