我有一个内部API,其中所有ViewSet
都具有LoginRequiredMixin
,因为该API仅由登录用户使用。
现在我有时需要通过auth_token
使它可用-例如。当用户未登录但具有令牌时。
我添加了TokenAuthentication
:
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.OrderingFilter'],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
],
}
并尝试使用Authorization标头:Token <MYTOKEN>
访问API,但是它将所有请求重定向到登录。
如何使其起作用,以便必须对用户进行身份验证或使用授权标头?
这是ViewSet
:
class OrderViewSet(LoginRequiredMixin, ModelViewSet):
serializer_class = OrderSerializer
filterset_class = OrderFilter
答案 0 :(得分:2)
关于这个问题,我为您提供2种解决方案
1。删除LoginRequiredMixin
,因为LoginRequiredMixin
用于django View身份验证,而不用于django rest框架视图(*身份验证)
class OrderViewSet(ModelViewSet):
serializer_class = OrderSerializer
filterset_class = OrderFilter
然后在setting.py
文件上添加默认的permission
和authentication
类REST_FRAMEWORK
,如下所示
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.OrderingFilter'],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
]
}
2。如果要在类视图上设置permission
和authentication
添加,则不必设置setting.py文件。试试这个
from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import TokenAuthentication, SessionAuthentication
class OrderViewSet(ModelViewSet):
permission_classes = (IsAuthenticated, )
authentication_classes = (SessionAuthentication, TokenAuthentication, )
serializer_class = OrderSerializer
filterset_class = OrderFilter
答案 1 :(得分:0)