Python 如何将OAuth2工具包与基于类的视图的Django REST框架一起使用?

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

我正在尝试将使用的API添加到使用的现有代码库中。现有视图利用了这样一个事实:OAuth2工具包的后端修改了Django的
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'
这将在浏览器中启用会话身份验证。您找到问题的解决方案了吗?