【问题标题】:Django restframework, Authentication credentials were not provided, knox-tokenauthenticationDjango rest 框架,未提供身份验证凭据,knox-token 身份验证
【发布时间】:2020-08-21 08:22:14
【问题描述】:

我从 Traversy Media 的 youtube 上学习了有关 Redox 和 Django 的教程。 我按照教程进行操作,现在我不知道它是否被诅咒了。

curl http://localhost:8000/api/auth/login/ -d \
'{"username": "Tom", "password": "PassWord@321"}' \
-H "Content-type: application/json" -X POST

通过这样做,我需要获取用户和相应的令牌,但我得到的是

{"detail":"Authentication credentials were not provided."}

我所做的一切 =>

# settings.py

INSTALLED_APPS = [
    'leads',
    'rest_framework',
    'frontend',
    'accounts',
    'knox',
    'django.contrib.admin', 
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ("knox.auth.TokenAuthentication", ),
}
# serializers.py

class LoginSerializer(serializers.Serializer):
   username = serializers.CharField()
   password = serializers.CharField()

   def validate(self, data):
      user = authenticate(**data)
      if user and user.is_active:
         return user
      raise serializers.ValidationError("Incorrect Credentials")
# api.py

class LoginAPI(generics.GenericAPIView):
   serializer_class = LoginSerializer

   def post(self, request, *args, **kwargs):
      serializer = self.get_serializer(data = request.data)
      serializer.is_valid(raise_exception = True)
      user = serializer.validated_data
      _, token = AuthToken.objects.create(user)
      return Response({
         "user": UserSerializer(user, context = self.get_serializer_context()).data,
         "token": token
      })

# leadmanager/urls.py

urlpatterns = [
    path("api/auth/", include("accounts.urls")),
]

# accounts/urls.py
urlpatterns = [
   path("login/", LoginAPI.as_view()),
]

我不知道它被压碎了。

【问题讨论】:

    标签: python django django-rest-framework django-authentication django-rest-knox


    【解决方案1】:

    请添加此代码

    class LoginAPI(generics.GenericAPIView):
       serializer_class = LoginSerializer
       permission_classes = () # empty tuple 
    
       ...........
    

    这里你需要覆盖permission_classes for LoginAPI view as permission_classes 负责检查请求是否被认证。由于 LoginAPI 向所有 View 没有权限检查的用户公开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-17
      • 2022-06-25
      • 2017-11-22
      • 2015-05-16
      • 2019-04-29
      • 2015-01-10
      • 1970-01-01
      • 2019-07-29
      相关资源
      最近更新 更多