7

我正在与 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
    ]

我正在寻找的可能吗?提前致谢 :)

4

4 回答 4

3

因此,第三方视图最合适的方式是通过在你的 : 中定义装饰器来使用它们urls.py

情况1

我假设这some_view是一个继承自的类rest_framework.views.APIView

网址.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())
]

案例2

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

网址.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))))
]

案例3

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

于 2020-03-22T21:56:02.440 回答
0

您可以覆盖默认身份验证类以跳过特定 url 的身份验证。

例如:

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现在在其余框架设置中使用此类。并删除默认IsAuthenticated类。

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

装饰器的方法更加冗长,通过查看函数你可以判断它是否是公共的。

于 2020-03-21T05:31:37.277 回答
0

@Bedilbek 的回答对我有用,但是如果您希望使用不同的语法并在视图中定义permission_classesandauthentication_classes而不是urls.py,您可以执行以下操作:

from rest_framework import permissions
from rest_framework.views import APIView

class SomeView(APIView):
    permission_classes = [permissions.AllowAny]
    authentication_classes = []
于 2021-12-28T20:14:43.087 回答
-1

你没试过吗:

from rest_framework.permissions import AllowAny
from rest_framework.decorators import authentication_classes, permission_classes

@authentication_classes((AllowAny, ))
@permission_classes((AllowAny, ))
def method()
于 2020-03-16T07:39:53.820 回答