2016-05-31 5 views
1

django 미들웨어에서 process_request 및 process_response 함수를 사용하여 뷰셋을 시작하기 전에 요청을 기록했습니다. 하지만 내부 서버 오류가 발생합니다. 내 코드에 무슨 문제가 있는지 이해하지 못한다.django 미들웨어 사용 중 ContentNotRenderedError

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) 

무엇이 누락 되었습니까? 오류가

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

어떤 서버를 사용하고 있습니까? 무슨 파이썬 버전? – FlipperPA

+2

@linuxfreak 오류 메시지가 무엇입니까? 질문에 추가하십시오. – rtindru

+0

질문에 오류를 추가했습니다 – linuxfreak

답변

2

이 문제는 미들웨어 방법의 return Response()입니다.

process_request 방법으로 응답을 보내면 장고는보기를 호출하지 않습니다. 당신은 아마 여기에 아무것도 반환하고 싶지 않을 것입니다.

process_response 메서드의 응답을 반환해야합니다. 보기의 원래 응답 (response)을 여기에서 반환하려고합니다. 다른 응답 (예 : Response(...))을 반환하면 장고는보기의 응답 대신 사용자에게이를 반환합니다.

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'개체가 어떤 속성이 '분할하지' 형식 오류가 파일 "/usr/local/lib/python2.7/dist-packages/django/utils/autoreload.py", 96 행, 래퍼 외, ev, tb = sys.exc_info() AttributeError : 'NoneType'객체 'exc_info'속성이 없습니다 – linuxfreak

+0

예, Django 문서는 여러분이'Response' 객체를 반환 할 수 있다고 말합니다 f rom process_request하지만, 장고는 뷰를 처리하는 대신 사용자에게 그 응답을 반환한다는 것을 의미합니다. 미들웨어가 항상 미들웨어에서 응답을 반환하는 경우 아무런 관점을 가질 필요가 없습니다. 비슷하게'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 
관련 문제