Python &引用;AccessToken.user“;必须是一个";“用户”;实例
我试图弄明白oAuth2基于令牌的身份验证已经3天了,但还没有用。我已经为用户身份验证编写了一个代码。然而,我得到了一个错误 ValueError位于/api/customer/login/无法分配“{'username': 'sanskars'}:“AccessToken.user”必须是“user”实例 这个问题的解决办法是什么?为什么会出现以下错误 视图.pyPython &引用;AccessToken.user“;必须是一个";“用户”;实例,python,django,python-3.x,oauth,django-rest-framework,Python,Django,Python 3.x,Oauth,Django Rest Framework,我试图弄明白oAuth2基于令牌的身份验证已经3天了,但还没有用。我已经为用户身份验证编写了一个代码。然而,我得到了一个错误 ValueError位于/api/customer/login/无法分配“{'username': 'sanskars'}:“AccessToken.user”必须是“user”实例 这个问题的解决办法是什么?为什么会出现以下错误 视图.py class UserLoginAPI(APIView): permission_classes = [AllowAny]
class UserLoginAPI(APIView):
permission_classes = [AllowAny]
serializer_class = UserLoginSerializer
def post(self, request, *args, **kwargs):
access_token = request.GET.get('access_token')
data = request.data
serializer = UserLoginSerializer(data=data)
if serializer.is_valid(raise_exception=True):
new_data = serializer.data
if new_data:
app = Application.objects.get(name="appname")
try:
print('trying to fetch old token if exists')
old_token = AccessToken.objects.get(user=new_data, appliction=app)
print('old_token',old_token)
except:
pass
else:
old_token.delete()
new_token = generate_token()
print('new_token',new_token)
AccessToken.objects.create(user=new_data, application=app, expires=datetime.now() + timedelta(days=365),token=new_token)
print('aceess',AccessToken)
return Response(new_data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class UserLoginSerializer(ModelSerializer):
username = CharField()
# email = EmailField(label='Email Address')
class Meta:
model = User
fields = [
'username',
'password',
]
extra_kwargs = {"password":{"write_only": True} }
序列化程序.py
class UserLoginAPI(APIView):
permission_classes = [AllowAny]
serializer_class = UserLoginSerializer
def post(self, request, *args, **kwargs):
access_token = request.GET.get('access_token')
data = request.data
serializer = UserLoginSerializer(data=data)
if serializer.is_valid(raise_exception=True):
new_data = serializer.data
if new_data:
app = Application.objects.get(name="appname")
try:
print('trying to fetch old token if exists')
old_token = AccessToken.objects.get(user=new_data, appliction=app)
print('old_token',old_token)
except:
pass
else:
old_token.delete()
new_token = generate_token()
print('new_token',new_token)
AccessToken.objects.create(user=new_data, application=app, expires=datetime.now() + timedelta(days=365),token=new_token)
print('aceess',AccessToken)
return Response(new_data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class UserLoginSerializer(ModelSerializer):
username = CharField()
# email = EmailField(label='Email Address')
class Meta:
model = User
fields = [
'username',
'password',
]
extra_kwargs = {"password":{"write_only": True} }
还有一个困惑是,注册用户时是否需要生成令牌?我创建了一个user实例,方法是user=user.objects.get(username=new_data['username']),然后在AccessToken中传递该用户实例。成功了。我现在还得做什么?