Python 如何将OAuth2工具包与基于类的视图的Django REST框架一起使用?
我正在尝试将使用的API添加到使用的现有代码库中。现有视图利用了这样一个事实:OAuth2工具包的后端修改了Django的Python 如何将OAuth2工具包与基于类的视图的Django REST框架一起使用?,python,django,oauth-2.0,django-rest-framework,oauth2-toolkit,Python,Django,Oauth 2.0,Django Rest Framework,Oauth2 Toolkit,我正在尝试将使用的API添加到使用的现有代码库中。现有视图利用了这样一个事实:OAuth2工具包的后端修改了Django的login\u requireddecorator的行为,以便它使用OAuth2身份验证。基于函数的视图与教程示例中的视图类似: from django.contrib.auth.decorators import login_required from django.http.response import HttpResponse @login_required() d
login\u required
decorator的行为,以便它使用OAuth2身份验证。基于函数的视图与教程示例中的视图类似:
from django.contrib.auth.decorators import login_required
from django.http.response import HttpResponse
@login_required()
def secret_page(request, *args, **kwargs):
return HttpResponse('Secret contents!', status=200)
我试图根据我的情况调整上面给出的示例,但我发现它并不完全对应,因为示例使用了DRF的ModelViewSet
类,而我当前的视图使用了(集成度较低的)基于类的通用视图:
from rest_framework import generics
from ..models import Session
from ..serializers import SessionSerializer
class SessionDetail(generics.UpdateAPIView):
queryset = Session.objects.all()
serializer_class = SessionSerializer
其中,我已在settings.py
中将默认权限类设置为IsAuthenticated
:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
}
这应该允许使用补丁请求更新会话
对象,但对于类似于使用login\u required
装饰的当前视图的用例,它似乎会返回403禁止
响应
如何更新SessionDetail
视图,使其行为与用login\u required
修饰的函数视图相同?我怀疑我需要使用permission类,因为这似乎是唯一一个required\u scopes
是可选的类。(用login\u required
修饰的视图也不提供required\u范围
)
是这样的吗?
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
from oauth2_provider.contrib.rest_framework import OAuth2Authentication, TokenHasReadWriteScope
from ..models import Session
from ..serializers import SessionSerializer
class SessionDetail(generics.UpdateAPIView):
authentication_classes = [OAuth2Authentication]
permission_classes = [TokenHasReadWriteScope]
queryset = Session.objects.all()
serializer_class = SessionSerializer
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_AUTHENTICATION_CLASSES': (
'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
)
}
此外,我是否必须使用默认的\u身份验证\u类
更新我的REST\u框架
设置,如下所示:
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
from oauth2_provider.contrib.rest_framework import OAuth2Authentication, TokenHasReadWriteScope
from ..models import Session
from ..serializers import SessionSerializer
class SessionDetail(generics.UpdateAPIView):
authentication_classes = [OAuth2Authentication]
permission_classes = [TokenHasReadWriteScope]
queryset = Session.objects.all()
serializer_class = SessionSerializer
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_AUTHENTICATION_CLASSES': (
'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
)
}
现在,如果我运行服务器并尝试使用可浏览的API发出修补程序请求,我会得到一个401 Unauthorized
错误:
另外,如果我使用刚刚使用python manage.py createsuperuser创建的用户名和密码登录,它会直接返回到401
页面,而不是像我所期望的那样使用表单发出补丁请求
关于如何解决这个问题有什么想法吗?尝试添加到默认的\u身份验证\u类
列表'rest\u framework.AUTHENTICATION.SessionAuthentication'
这将在浏览器中启用会话身份验证。您找到问题的解决方案了吗?