覆盖 OPTION 请求的 Django Rest Framework 标头

Eva*_*rda 2 python django django-rest-framework

当我向端点发送 http OPTION 请求时,Django Rest Framework 使用以下 paylod 进行响应:

\n\n
{\n    "name": "Get Categorias",\n    "description": "",\n    "renders": [\n        "application/json",\n        "text/html"\n    ],\n    "parses": [\n        "application/json",\n        "application/x-www-form-urlencoded",\n        "multipart/form-data"\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及以下标题:

\n\n
Date \xe2\x86\x92Fri, 08 Feb 2019 12:25:50 GMT\nServer \xe2\x86\x92Apache/2.4.29 (Ubuntu)\nContent-Length \xe2\x86\x92173\nVary \xe2\x86\x92Accept\nAllow \xe2\x86\x92GET, HEAD, OPTIONS\nX-Frame-Options \xe2\x86\x92SAMEORIGIN\nKeep-Alive \xe2\x86\x92timeout=5, max=100\nConnection \xe2\x86\x92Keep-Alive\nContent-Type \xe2\x86\x92application/json\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是代码:

\n\n
@permission_classes((AllowAny,))\nclass GetCategorias(APIView):\n    def get(self, request):\n\n        query = "SELECT * FROM categoria ORDER BY nome ASC;"\n\n        find = FuncaoCursorFetchAll.queryCursor(query)\n        if find:\n            result = []\n            for cat in find:\n                result.append({"id" : cat[0], "categoria" : cat[1]})\n\n\n            response = JsonResponse({"categorias" : result}, encoder=DjangoJSONEncoder,safe=False,content_type="application/json;charset=utf-8")\n            response[\'Access-Control-Allow-Origin\'] = \'*\'\n            response[\'Access-Control-Allow-Methods\'] = \'GET, OPTIONS, HEAD\'\n            response[\'Access-Control-Allow-Headers\'] = \'Content-Type, Authorization\'\n            return response\n        else:\n            data = {"error": "Nenhum registro encontrado"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

网址定义:

\n\n
path(\'categorias/\', views.GetCategorias.as_view(), name=\'categorias\'),\n
Run Code Online (Sandbox Code Playgroud)\n\n

我需要覆盖这个标题。我不知道这是从哪里来的,因为我没有 OPTIONS 请求的明确端点。任何人都可以帮助我发现在哪里可以配置我需要的正确标头?

\n

Yon*_* Jo 5

您可以options轻松覆盖。

from rest_framework.response import Response

class ClassBasedView(APIView):
    def options(self, request, *args, **kwargs):
        return Response({'foo': 'bar'})

@api_view(['GET', 'POST', 'OPTIONS'])
def func_based_view(request):
    if request.method == 'OPTIONS':
        return Response({'foo': 'bar'})
    else:
        return Response({'message': 'not options!'})
Run Code Online (Sandbox Code Playgroud)

如果您不了解 REST 框架中的视图?检查这个文档

您想覆盖标头吗?您可以通过 给出您自己的标题Response。检查此响应文档

您的OPTIONS有效负载是metadata您的视图。您还可以覆盖元数据。请参阅此元数据文档