删除特定 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。并去掉默认的IsAuthenticated
class.
尽管我推荐装饰器方法。
检查文档: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_classes
和 authentication_classes
都不能附加到 class:
@Bedilbek 的回答对我有用,但如果你更喜欢使用不同的语法并在你的视图中定义 permission_classes
和 authentication_classes
而不是 urls.py
,你可以这样做以下:
from rest_framework import permissions
from rest_framework.views import APIView
class SomeView(APIView):
permission_classes = [permissions.AllowAny]
authentication_classes = []
我在使用 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。并去掉默认的IsAuthenticated
class.
尽管我推荐装饰器方法。 检查文档: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_classes
和 authentication_classes
都不能附加到 class:
@Bedilbek 的回答对我有用,但如果你更喜欢使用不同的语法并在你的视图中定义 permission_classes
和 authentication_classes
而不是 urls.py
,你可以这样做以下:
from rest_framework import permissions
from rest_framework.views import APIView
class SomeView(APIView):
permission_classes = [permissions.AllowAny]
authentication_classes = []