首页 > 解决方案 > 如何在 django 中间件中执行内容协商?

问题描述

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

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 未在响应上设置

如何在这里执行内容协商?

标签: djangodjango-rest-frameworkpython-3.6django-middlewaredjango-2.2

解决方案


我认为您使用的是DRF 的Responseclass

你应该使用Django 的HttpResponse

# 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)

推荐阅读