如何从django自定义中间件类返回rest_framework.response对象?

时间:2015-01-28 06:30:33

标签: django django-rest-framework django-middleware

我正在尝试编写一个确保用户登录的中间件类。 但问题是这个中间件类只适用于一小组视图,这些视图返回DRF的Response对象而不是HTTPResponse对象,这些视图也使用{来装饰{1}}。

因此,当我尝试从中间ware类返回一个Response对象时,会引发此错误。

api_view

我在SO上搜索了一下,我猜错误在某种程度上与 assert renderer, ".accepted_renderer not set on Response" AssertionError: .accepted_renderer not set on Response 装饰器有关。但我对如何解决这个问题很困惑。

感谢任何帮助。 :)

2 个答案:

答案 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_rendereraccepted_media_typerenderer_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)