删除特定 url 路径的身份验证和权限

remove authentication and permission for specific url path

我在使用 DRF 时遇到了这个问题。我有一个第三方视图,我正在将其导入我的 urls.py 文件中,如下所示:

from some_package import some_view

urlpatterns = [
    path('view/',some_view)
]

但我面临的问题是因为我在 settings.py 中启用了默认权限 类,如下所示:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
               'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES':(
                'rest_framework.permissions.IsAuthenticated',
    ),

}

现在,当我使用 url 调用该视图时,它会给我 身份验证错误,因为我 未提供令牌 。有没有一种方法可以绕过身份验证错误而不必直接更改视图,我知道我们可以删除该特定视图的权限,但为此我必须更改 some_view 函数代码。但我不想那样做,假设我们无权访问该功能,我们只能传递数据和接收响应。我怎样才能绕过身份验证而不必更改该功能代码。 我尝试搜索但找不到我要找的东西。

我假设我们可以通过某种方式从 urls.py 做到这一点,比如指定任何参数或类似的东西,使特定视图绕过身份验证而无需更改功能代码。

像这样的东西:

from some_package import some_view

    urlpatterns = [
        path('view/',some_view,"some_parameter") #passing someparameter from here or something like that
    ]

这可能是我要找的东西吗?提前致谢:)

您可以覆盖默认身份验证 class 以跳过特定网址的身份验证。

例如:

class CustomIsAuthenticated(IsAuthenticated):

    def has_permission(self, request, view):
        # make a list of public urls
        if request.path in PUBLIC_URLS:
            return True
        return super().has_permission(request, view)

您必须创建 PUBLIC_URLS 绕过身份验证的列表。

现在在其余框架设置的 DEFAULT_PERMISSION_CLASSES 中使用此 class。并去掉默认的IsAuthenticatedclass.

尽管我推荐装饰器方法。 检查文档:https://www.django-rest-framework.org/api-guide/permissions/#allowany

装饰器方法更冗长,通过查看函数,您可以确定它是否 public。

因此,第三方视图最合适的方法是通过在 urls.py:

中定义它们来使用装饰器

案例一

我假设 some_view 是 class 继承自 rest_framework.views.APIView:

urls.py

from django.urls import path
from rest_framework.decorators import permission_classes, authentication_classes
from rest_framework.permissions import AllowAny

from some_package import some_view

urlpatterns = [
    path('', authentication_classes([])(permission_classes([AllowAny])(some_view)).as_view())
]

案例二

我假设 some_view 是一个简单的 Django 视图函数,您需要为 GET 方法定义它:

urls.py

from django.urls import path
from rest_framework.decorators import api_view, permission_classes, authentication_classes
from rest_framework.permissions import AllowAny

from some_package import some_view

urlpatterns = [
    path('', api_view(['GET'])(authentication_classes([])(permission_classes([AllowAny])(some_view))))
]

案例三

我假设 some_view 是一个 api_view 修饰的 DRF 视图函数。这是最难的,也可能是最不可能的部分,因为你必须取消装饰之前的 api_view 装饰器。如果视图函数用 api_view 装饰,那么它已经转换为 Django 视图函数,因此 permision_classesauthentication_classes 都不能附加到 class:

@Bedilbek 的回答对我有用,但如果你更喜欢使用不同的语法并在你的视图中定义 permission_classesauthentication_classes 而不是 urls.py,你可以这样做以下:

from rest_framework import permissions
from rest_framework.views import APIView

class SomeView(APIView):
    permission_classes = [permissions.AllowAny]
    authentication_classes = []