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

Shu*_*gan 5 python django django-rest-framework django-rest-auth django-rest-framework-simplejwt

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

from some_package import some_view

urlpatterns = [
    path('view/',some_view)
]
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

现在,当我使用 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
    ]
Run Code Online (Sandbox Code Playgroud)

有可能是我在找什么吗?提前致谢 :)

Bed*_*bek 6

因此,对于第三方视图来说,最合适的方法是通过在您的 中定义它们来使用装饰器urls.py

情况1

我假设这some_view是一个继承自的类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())
]
Run Code Online (Sandbox Code Playgroud)

案例2

我假设这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))))
]
Run Code Online (Sandbox Code Playgroud)

案例3

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