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

时间:2016-07-15 17:33:10

标签: python django rest django-rest-framework

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

目前正在OPTIONS来电,

{
  "parses": [
    "application/json",
    "application/x-www-form-urlencoded",
    "multipart/form-data"
  ],
  "renders": [
    "application/json"
  ],
  "name": "Login Oauth2",
  "description": ""
}

这是我不希望有人窥视的东西。我希望返回一个空白字符,就像github在其API上做的那样。

我试过

@api_view(['POST'])
def my_method(request):
    if request.method == 'OPTIONS':
            return Response()

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

Allow →POST, OPTIONS, OPTIONS

重复OPTIONS

我如何实现它?感谢。

2 个答案:

答案 0 :(得分:3)

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

REST_FRAMEWORK = {
    'DEFAULT_METADATA_CLASS': None,
}
if DEBUG:
    # the default value
    REST_FRAMEWORK['DEFAULT_METADATA_CLASS']: 'rest_framework.metadata.SimpleMetadata'

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

答案 1 :(得分:1)

只需实施custom permission class

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

还使用DEFAULT_PERMISSION_CLASSES设置将其设置为全局默认权限。

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'your_app_name.permissions.DisableOptionsPermission',
    )
}

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