【问题标题】:ContentNotRenderedError while using django middleware使用 django 中间件时出现 ContentNotRenderedError
【发布时间】:2016-09-29 09:23:36
【问题描述】:

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

【问题讨论】:

  • 您使用的是什么服务器?什么 Python 版本?
  • @linuxfreak 错误信息是什么?请在问题中添加它。
  • 我在问题中添加了错误
  • 我使用的是 python 2.7

标签: django python-2.7 django-rest-framework


【解决方案1】:

问题在于您的中间件方法中的return Response()

如果您在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 文档。

【讨论】:

  • 根据 django 文档,我们可以从 process_request 和 process_response 返回 Response 对象。无论如何,我试着不像你说的那样从 process_request 返回并遇到以下错误:
  • 文件“/usr/lib/python2.7/wsgiref/simple_server.py”,第 33 行,关闭 self.status.split(' ',1)[0], self.bytes_sent AttributeError :'NoneType'对象没有属性'split'类型错误:'NoneType'对象不可调用原始异常是:回溯(最近一次调用):文件“/usr/local/lib/python2.7/dist-packages/django /utils/autoreload.py",第 96 行,在 wrapper et, ev, tb = sys.exc_info() AttributeError: 'NoneType' object has no attribute 'exc_info'
  • 是的,Django 文档说你可以process_request 返回一个 Response 对象,但这意味着 Django 会将该响应返回给用户,而不是处理风景。如果您的中间件总是从您的中间件返回响应,那么拥有任何视图是没有意义的。同样,如果你总是从 process_response 返回 Response(...),那么 Django 将返回那个响应而不是视图的响应。
【解决方案2】:

我解决了这个问题。这是因为 process_response 返回的响应对象没有实际响应。我将其修改为以下,并且有效。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2015-11-12
    • 2011-04-14
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多