我正在尝试编写一个确保用户登录的中间件类。
但问题是这个中间件类只适用于一小组视图,这些视图返回DRF的Response
对象而不是HTTPResponse
对象,这些视图也使用{来装饰{1}}。
因此,当我尝试从中间ware类返回一个Response对象时,会引发此错误。
api_view
我在SO上搜索了一下,我猜错误在某种程度上与 assert renderer, ".accepted_renderer not set on Response"
AssertionError: .accepted_renderer not set on Response
装饰器有关。但我对如何解决这个问题很困惑。
感谢任何帮助。 :)
答案 0 :(得分:19)
我刚刚遇到这个问题。此解决方案不使用Django Rest Framework响应,但如果您的服务器只返回JSON,则此解决方案可能适合您。
django 1.7中的新功能是JSONResponse响应类型。
https://docs.djangoproject.com/en/1.7/ref/request-response/#jsonresponse-objects
在中间件中,您可以在没有所有"没有接受的渲染器的情况下返回这些响应"和#34;响应没有属性编码"错误。
它与DRF响应的格式非常相似
导入如下:
from django.http import JsonResponse
以及如何使用它:
return JsonResponse({'error': 'Some error'}, status=401)
希望这可以帮助你!
答案 1 :(得分:5)
我自己通过模仿其余框架视图如何用accepted_renderer
,accepted_media_type
和renderer_context
修补响应对象来解决此问题。在我的情况下,我只想使用rest框架Response
类返回401响应,部分原因是当我调用self.client.get(...)
并声明response.data
时,我的测试需要一个rest框架响应。
其他用例可能需要您在renderer_context
中提供其他信息,或使用其他accepted_renderer
。
from rest_framework import status
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response
class MiddlewareClass(object):
def __init__(self, get_response):
self.get_response = get_response
def unauthorized_response(self, request):
response = Response(
{"detail": "This action is not authorized"},
content_type="application/json",
status=status.HTTP_401_UNAUTHORIZED,
)
response.accepted_renderer = JSONRenderer()
response.accepted_media_type = "application/json"
response.renderer_context = {}
return response
def __call__(self, request: HttpRequest):
if not self.authorized(request):
return self.unauthorized_response(request)
return self.get_response(request)