API根不具有JWT_Authentication的has_permissions

时间:2019-06-19 18:41:46

标签: django django-rest-framework django-rest-auth

尝试根据DRF实现djangorestframework_simplejwt。在基于https://simpleisbetterthancomplex.com/tutorial/2018/12/19/how-to-use-jwt-authentication-with-django-rest-framework.html实现所有内容之后,并且当我登录到localhost:8000时,API根视图不可用,并且错误是属性错误。

“ JWTAuthentication”对象没有属性“ has_permission”

当我查看ModelViewSets本身时,它们看起来很好。这只是API根本身。当我注销并尝试访问API根目录时,返回HTTP 403时页面加载非常好。 登录后是否不应该访问API根目录?是否可以在views.py中实现(或扩展)漏洞?

编辑:

Internal Server Error: /api/
Traceback (most recent call last):
  File "C:\Users\yoom\Code\test\qrveltest\venv\lib\site-packages\django\core\handlers\exception.py", line 3
4, in inner
    response = get_response(request)
  File "C:\Users\yoom\Code\test\qrveltest\venv\lib\site-packages\django\core\handlers\base.py", line 115, i
n _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\yoom\Code\test\qrveltest\venv\lib\site-packages\django\core\handlers\base.py", line 113, i
n _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\yoom\Code\test\qrveltest\venv\lib\site-packages\django\views\decorators\csrf.py", line 54,
 in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\Users\yoom\Code\test\qrveltest\venv\lib\site-packages\django\views\generic\base.py", line 71, in
 view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\yoom\Code\test\qrveltest\venv\lib\site-packages\rest_framework\views.py", line 495, in dis
patch
    response = self.handle_exception(exc)
  File "C:\Users\yoom\Code\test\qrveltest\venv\lib\site-packages\rest_framework\views.py", line 455, in han
dle_exception
    self.raise_uncaught_exception(exc)
  File "C:\Users\yoom\Code\test\qrveltest\venv\lib\site-packages\rest_framework\views.py", line 483, in dis
patch
    self.initial(request, *args, **kwargs)
  File "C:\Users\yoom\Code\test\qrveltest\venv\lib\site-packages\rest_framework\views.py", line 401, in ini
tial
    self.check_permissions(request)
  File "C:\Users\yoom\Code\test\qrveltest\venv\lib\site-packages\rest_framework\views.py", line 334, in che
ck_permissions
    if not permission.has_permission(request, self):
AttributeError: 'JWTAuthentication' object has no attribute 'has_permission'
[19/Jun/2019 14:52:38] "GET /api/ HTTP/1.1" 500 95529

这是views.py:

from django.views.generic import ListView
from rest_framework import viewsets
from .serializers import *
from django_filters import rest_framework as filters
from rest_framework.permissions import IsAuthenticated

class HomePageView(ListView):
    model = Test
    template_name = 'home.html'


class UserViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated, )
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_fields = ('username', 'email')


class TestViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated, )
    queryset = Test.objects.all()
    serializer_class = TestSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_fields = ('id', 'author')

    def get_queryset(self):
        queryset = Test.objects.all()
        username = self.request.user
        if username is not None:
            queryset = queryset.filter(author__username=username)
        return queryset

和urls.py:

from django.urls import path, include
from rest_framework import routers
from .views import *
from rest_framework_simplejwt import views as jwt_views

router = routers.DefaultRouter()
router.register('users', UserViewSet)
router.register('test', TestViewSet)

urlpatterns = [
    path('', HomePageView.as_view(), name='home'),
    path('api/', include(router.urls)),
    path('api/token/', jwt_views.TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', jwt_views.TokenRefreshView.as_view(), name='token_refresh'),
]

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并感谢您的评论。如果还有其他人遇到这个问题,我会在这里为您撰写。您设置中的一个错误很可能是确保在身份验证默认值而非权限下添加JWT,例如:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
        
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
}