使用django中间件时ContentNotRenderError

使用django中间件时ContentNotRenderError,django,python-2.7,django-rest-framework,Django,Python 2.7,Django Rest Framework,我在django中间件中使用了process_request和process_response函数,以便在点击视图集之前记录请求。但是,我得到了内部服务器错误。我不明白我的代码出了什么问题 class MyMiddleware(): def process_request( self, request ): print "xxxxx" return Response( status=status.HTTP_200_OK ) def proce

我在django中间件中使用了process_request和process_response函数,以便在点击视图集之前记录请求。但是,我得到了内部服务器错误。我不明白我的代码出了什么问题

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'
----------------------------------------

问题在于中间件方法中的
返回响应()

如果在方法中返回响应,Django将不会调用该视图。你可能不想在这里归还任何东西

您应该从该方法返回一个响应。您可能希望从此处的视图(
response
)返回原始响应。如果您返回不同的响应(例如,
response(…)
),Django将向用户返回此响应,而不是从视图返回响应

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

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

请参阅Django文档,了解有关每个中间件方法应返回的内容的更多信息。

我解决了这个问题。这是因为process\u response返回的响应对象没有实际响应。我把它改成了following,它成功了

class MyMiddleware(): 
    def process_request( self, request ): 
        print "xxxxx"
        return None
    def process_response( self, request, response ): 
        print "xxxxx" 
        return response

你用的是什么服务器?什么Python版本?@linuxfreak错误消息是什么?请在问题中添加它。我在问题中添加了错误。我正在使用Python2.7。根据django文档,我们可以从process_请求和process_响应返回Response对象。无论如何,我试着没有像你说的那样从process_请求返回,并出现以下错误:文件“/usr/lib/python2.7/wsgiref/simple_server.py”,第33行,在self.status.split(“”,1)[0],self.bytes\u sent AttributeError:“NoneType”对象没有属性“split”TypeError:“NoneType”对象不可调用原始异常是:回溯(最近一次调用):文件“/usr/local/lib/python2.7/dist packages/django/utils/autoreload.py”,第96行,包装器et,ev,tb=sys.exc\u info()AttributeError:“非类型”对象没有属性“exc_info”是的,Django文档说您可以从
process_request
返回
响应
对象,但这意味着Django将向用户返回该响应,而不是处理视图。如果中间件总是从中间件返回响应,那么拥有任何视图都没有意义。类似地,如果总是从
process\u Response
返回
Response(…)
,那么Django将返回该响应,而不是视图中的响应。