Python 删除特定url路径的身份验证和权限
我与DRF合作,遇到了这个问题。我在Python 删除特定url路径的身份验证和权限,python,django,django-rest-framework,django-rest-auth,django-rest-framework-simplejwt,Python,Django,Django Rest Framework,Django Rest Auth,Django Rest Framework Simplejwt,我与DRF合作,遇到了这个问题。我在url.py文件中导入了一个第三方视图,如下所示: from some_package import some_view urlpatterns = [ path('view/',some_view) ] from some_package import some_view urlpatterns = [ path('view/',some_view,"some_parameter") #passing someparam
url.py
文件中导入了一个第三方视图,如下所示:
from some_package import some_view
urlpatterns = [
path('view/',some_view)
]
from some_package import some_view
urlpatterns = [
path('view/',some_view,"some_parameter") #passing someparameter from here or something like that
]
但我面临的问题是,我在我的settings.py中启用了默认权限类,如下所示:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES':(
'rest_framework.permissions.IsAuthenticated',
),
}
现在,当我使用url调用该视图时,它会给我身份验证错误,因为我没有提供令牌。是否有一种方法可以绕过身份验证错误而不必直接在视图中进行更改,我知道我们可以删除该特定视图的权限,但为此,我必须对一些视图
功能代码进行更改。但我不想这样做,假设我们没有访问该函数的权限,我们只能传递数据和接收响应。如何绕过身份验证而不必更改该函数代码。
我试着搜索,但找不到我要找的东西
我假设我们可以通过url.py实现这一点,比如指定任何参数或类似的东西,使特定视图绕过身份验证,而不必更改代码函数
像这样的事情:
from some_package import some_view
urlpatterns = [
path('view/',some_view)
]
from some_package import some_view
urlpatterns = [
path('view/',some_view,"some_parameter") #passing someparameter from here or something like that
]
有可能我在找什么吗?提前感谢:)您没有尝试:
from rest_framework.permissions import AllowAny
from rest_framework.decorators import authentication_classes, permission_classes
@authentication_classes((AllowAny, ))
@permission_classes((AllowAny, ))
def method()
您可以覆盖默认身份验证类以跳过特定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)
您必须创建一个绕过身份验证的公共URL
列表
现在在rest框架设置中的DEFAULT\u PERMISSION\u类中使用这个类。并删除默认的IsAuthenticated
类
尽管我推荐装饰师的方法。
检查文档:
Decorators方法更为详细,通过查看函数可以确定它是否是公共的。因此,第三方视图最合适的方法是通过在URL.py中定义decorator来使用它们:
案例1
我假设some\u view
是从rest\u framework.views.APIView
继承的类:
url.py
从django.url导入路径
从rest\u framework.decorators导入权限类、身份验证类
从rest\u framework.permissions导入允许
从某些\u包导入某些\u视图
URL模式=[
路径(“”,身份验证类([])(权限类([AllowAny])(某些视图))。作为视图()
]
案例2
我假设some_view
是一个简单的Django视图函数,您需要为GET
方法定义它:
url.py
从django.url导入路径
从rest\u framework.decorators导入api\u视图、权限\u类、身份验证\u类
从rest\u framework.permissions导入允许
从某些\u包导入某些\u视图
URL模式=[
路径(“”,api_视图(['GET'])(身份验证类([])(权限类([AllowAny])(某些视图)))
]
案例3
我假设some\u view
是一个api\u view
DRF视图函数。这是最困难的部分,也可能是最不可能的部分,因为您必须取消装饰先前的api\u视图。如果视图函数是用api\u view
修饰的,那么它已经被转换成Django视图函数,所以permission\u classes
和authentication\u classes
都不能附加到类中:我不知道有什么方法可以这样做。最好是包装视图(即编写自己的视图)并设置身份验证\u类
。您也可以删除DEFAULT\u AUTHENTICATION\u类
和DEFAULT\u PERMISSION\u类
,将其移动到您自己的父类中进行身份验证和授权,然后在视图中继承。然后您的第三方视图将不会默认为您在settings.py
中提供的视图,因为您没有提供任何内容。是的,我可以这样做,但这将导致进行更多更改,与其按照您的建议执行操作,不如重写该函数并为重写的函数指定身份验证\u类
,然后从该重写的函数调用原始函数@这就是我第一次评论的意思。老实说,如果你只是导入了一个视图,我认为这是一种方法。我已经尝试过这种覆盖方法。这对我很有效。这样做是个好主意。我很久以前就这么做了。