【问题标题】:How to perform content negotiation in django middleware?如何在 django 中间件中执行内容协商?
【发布时间】:2019-06-20 05:12:59
【问题描述】:

假设我有一个自定义Django Middleware,如果不返回rest_framework Response,则检查请求标头是否有jwt令牌,

middleware.py

@staticmethod
def process_view(request, view_func, view_args, view_kwargs):
    try:
        jwt_token = request.headers["token"]
    except KeyError:
        response = Response(status=status.HTTP_403_FORBIDDEN)
        return response

但我遇到了类似的错误

.accepted_renderer 未在响应上设置

这里如何进行内容协商?

【问题讨论】:

    标签: django django-rest-framework python-3.6 django-middleware django-2.2


    【解决方案1】:

    我认为您使用的是DRF's Response class

    你应该使用Django's HttpResponse class 作为,

    # middleware.py
    from django.http.response import HttpResponse
    
    
    @staticmethod
    def process_view(request, view_func, view_args, view_kwargs):
        try:
            jwt_token = request.headers["token"]
        except KeyError:
            response = HttpResponse(status=403)
            return response


    更新-1

    我不确定这种方法是还是,但效果很好。

    创建一个虚拟视图,它返回 DRF Response 并使用它来返回响应。

    from rest_framework.response import Response
    from rest_framework.decorators import api_view
    
    
    @api_view()
    def custom_view(request):
        return Response(status=403)
    
    
    class Foo(...):
    
        @staticmethod
        def process_view(request, view_func, view_args, view_kwargs):
            try:
                jwt_token = request.headers["token"]
            except KeyError:
                return custom_view(request)

    【讨论】:

    • 是的,我使用 JsonResponse 代替,但问题是我们无法利用可浏览的 API
    • 您无法利用 middleware 的 DRF Browsable API。
    • DRF 响应是SimpleTemplateResponse 的子类,它是HttpResponse 的子类。
    • 是的。但是,如果 HttpResponse 的自定义子类实现了 render 方法,Django 会将其视为模拟 SimpleTemplateResponse,并且 render 方法本身必须返回一个有效的响应对象。 ref
    • .accepted_renderer 属性在视图返回响应之前由 APIView 或 @api_view 自动设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多