如何全局禁用 Django Rest Framework 上的 OPTIONS 方法?

Riv*_*diz 2 python django rest django-rest-framework

我想OPTIONS全局(在所有 API 端点上)禁用使用 Django Rest Framework (DRF) 构建的 API 上的方法

目前有OPTIONS电话返回,

{
  "parses": [
    "application/json",
    "application/x-www-form-urlencoded",
    "multipart/form-data"
  ],
  "renders": [
    "application/json"
  ],
  "name": "Login Oauth2",
  "description": ""
}
Run Code Online (Sandbox Code Playgroud)

这是我不希望有人偷看的东西。我想返回一个空白字符,就像 github 在其 API 或其他东西上所做的那样。

我试过

@api_view(['POST'])
def my_method(request):
    if request.method == 'OPTIONS':
            return Response()
Run Code Online (Sandbox Code Playgroud)

在基于函数的视图上,它返回一个但检查标题显示,

Allow ?POST, OPTIONS, OPTIONS
Run Code Online (Sandbox Code Playgroud)

其中有一个重复的OPTIONS.

我如何实现它?谢谢。

小智 7

在您的设置中,添加如下内容:

REST_FRAMEWORK = {
    'DEFAULT_METADATA_CLASS': None,
}
if DEBUG:
    # the default value
    REST_FRAMEWORK['DEFAULT_METADATA_CLASS']: 'rest_framework.metadata.SimpleMetadata'
Run Code Online (Sandbox Code Playgroud)

您也可以实现自己的元数据类。将此设置为 None 将使其在OPTIONS请求时返回 HTTP 405 。


kap*_*sdv 3

只需实现一个自定义权限类即可。

your_app/permissions.py(您的应用程序的权限文件)

from rest_framework import permissions

class DisableOptionsPermission(permissions.BasePermission):
    """
    Global permission to disallow all requests for method OPTIONS.
    """

    def has_permission(self, request, view):
        if request.method == 'OPTIONS':
            return False
        return True
Run Code Online (Sandbox Code Playgroud)

还可以使用 DEFAULT_PERMISSION_CLASSES 设置将此设置为全局默认权限。

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'your_app_name.permissions.DisableOptionsPermission',
    )
}
Run Code Online (Sandbox Code Playgroud)

这将禁止所有对 OPTIONS 方法的传入请求。