上述图中所示的时在Flask和Django框架中的登录流程以及相关的验证,左边的是"post请求下的流程",右边的是“get请求下的流程验证”。
图中的结构可以解决登录过程中的问题,以及登录验证,通过session和cookie的应用来判断用户的登录状态。值得注意的是:
-
session是用来判断现在是否已经登录,用来解决http的无状态问题,关于这个问题的详解可以参考我的相关文章。
-
cookie是用来判断以前是否登录过。用来完成登录验证。
-
整个登录验证过程是通过session和cookie的结合来完成的。
下面是Django框架的的登录验证程序(完全按照上述图中的结构进行编程的):
def login_views(request):
# 先判断get请求还是post请求
if request.method == 'GET':
#get请求-判断session,判断cookie,登录页
# 判断session中是否有登录信息
if 'uid' in request.session and 'uphone' in request.session:
# 有登录信息保存在session中
return HttpResponse('您已成功登录过')
else:
#没有登录信息保存在session,判断cookie中是否有登录信息
if 'uid' in request.COOKIES and 'uphone' in request.COOKIES:
#cookies中有登录信息-曾经记住过密码
#将cookies中的信息取出来保存进session中,再返回到首页
uid = request.COOKIES['uid']
uphone = request.COOKIES['uphone']
request.session['uid'] = uid
request.session['uphone'] = uphone
return HttpResponse('您已成功登录')
else:
#cookies中没有登录信息-去王往登录页
form = LoginForm()
return render(request,'login.html',locals())
else:
#post请求-实现登录操作
#获取手机号和密码
uphone = request.POST['uphone']
upwd = request.POST['upwd']
#判断手机号和密码是否存在(登录是否成功)
users = User.objects.filter(uphone=uphone,upwd=upwd)
if users:
#登录成功:先存进session
request.session['uid'] = users[0].id
request.session['uphone'] = uphone
#声明响应对象:响应一句话“登录成功”
resp = HttpResponse('登录成功')
#判断是否存进cookies
if 'isSaved' in request.POST:
expire = 60*60*24
resp.set_cookie('uid',users[0].id,expire)
resp.set_cookie('uphone',uphone,expire)
return resp
else:
#登录失败
form = LoginForm()
return render(request,'login.html',locals())