Django REST框架检查用户是否存在及密码
下面的代码是我现在用的,虽然它不是最安全的,但能完成任务。不过我想用POST方法来实现。有没有什么建议可以帮我改一下?
我有一个叫serializer.py的类。
class userLoginSerializer(serializers.ModelSerializer):
class Meta:
model = users
fields = ('nick', 'pass_field')
@api_view(['GET'])
def user_login(request,nick,pass_field):
但是当我发送两个值nick和passfield时,它提示nick已经存在,并返回404错误,因为它把这个信息传到了serializers.errors里。我只想用POST方法传递代码,并验证它是否存在,然后返回一个成功的JSON。下面的代码可以用,但实现方式不是最好的。
if request.method == 'GET':
try:
users.objects.get(nick=nick,pass_field=pass_field)
json = {}
json['message'] = 'success'
return Response(json, status=status.HTTP_201_CREATED)
except users.DoesNotExist:
json = {}
json['message'] = 'error'
return Response(json, status=status.HTTP_400_BAD_REQUEST)
2 个回答
0
我实现了一个使用JWT登录的方法,它的工作流程是这样的:
- 首先,我获取请求中发送的邮箱和密码,并把它们转换成一个字符串变量。
- 接着,我检查这个邮箱是否已经存在于我创建的用户模型中。
- 如果用户已经存在,我会把这个用户对象转换成字典,这样我就能获取到对应的密码。
- 然后,我会把用户模型中的密码和请求中发送的密码进行比对。
- 如果邮箱在用户模型中存在,并且对应的密码和请求中发送的密码匹配,我就会使用pyJWT生成一个包含我自定义数据的JWT,并返回响应。
- 在其他情况下,如果邮箱和密码不匹配,我会返回“No Match”。
假设请求是 {"email":"xyz@gmail.com", "password":"12345" }
@api_view(['POST'])
def signin(request):
email = list(request.data.values())[0] #gets email value from post request {"email":"xyz@gmail.com", "password":"123"} -> this xyz@gmail.com
password = list(request.data.values())[1] #gets password value from post request {"email":"xyz@gmail.com", "password":"123"} -> this 123
usr = User.objects.filter(email=email).exists() #checks if email exists
if usr:
dictionary = User.objects.filter(email=email).values()[0] #converts object to dictionary for accessing data like dictionary["password"] dictionary["first_name"] etc
if usr and dictionary["password"] == password: #check if email and its corresponing password stored matches the password that is sent
branch = dictionary["branch"]
id = dictionary["id"]
encoded_jwt = jwt.encode({'email': email,}, 'secret', algorithm='HS256')
return Response({'token':encoded_jwt,'email':email,'branch':branch,'id':id})
else:
return Response({'No Match'})
return Response({'No Match'})
3
模型是用户还是User?为什么不直接用Django的User模型呢?
User类已经有一个检查密码的方法,并且用一种叫做哈希算法的方式来存储密码:https://docs.djangoproject.com/en/dev/ref/contrib/auth/#methods。千万不要以明文形式存储密码,这样非常不安全。
如果使用Django的User模型(或者从它继承的类),你可以很简单地这样检查密码是否有效:
try:
user = User.objects.get(username=nick)
if user.check_password(pass_field):
#TODO: Valid password, insert your code here
else:
#TODO: Password not valid, handle it here
pass
except User.DoesNotExist:
#TODO: Your error handler goes here
pass
你还可以从ApiView继承,并在post方法中实现你的代码:http://www.django-rest-framework.org/api-guide/views