前言
浏览器向服务器提交数据,然后生成session存在数据库,并将sessionid 返回给浏览器,然后浏览器将sessionid作为cookie保存。每个客户端在服务器端有一个独立的session
一、保存验证码
登陆成功后,需要向request.session中保存数据,由于现在的验证结构中有三个信息,验证码、用户名、密码,根据代码逻辑,验证码需要的一个被验证,因此先把验证码信息传入session中(把之前用的全局变量注释掉)
def img_code(request):
img, code_string = check_code(font_file='web/static/font/AaManYuShouXieTi.ttf')
request.session['code'] = code_string
request.session.set_expiry(20)
stream = BytesIO()
img.save(stream, 'png')
return HttpResponse(stream.getvalue())
二、保存用户信息
保存后台生成的验证码后,直接和post方式得到的验证码作比较,成功就比较用户密码,用户密码正确就保存到session中的info字段,以待后期使用,然后重新设置session存在的时间
def login(request):
if request.method == "GET":
return render(request, 'login1.html')
name = request.POST.get('user')
pwd = request.POST.get('pwd')
code_get = request.POST.get('code')
code_session = request.session.get('code','')
if code_get.upper() != code_session:
return render(request, 'login1.html', {"error_msg": "验证码错误"})
data_list = models.Admin.objects.all()
for data in data_list:
if data.username == name and data.password == pwd:
request.session['info'] = {'username':data.username,"password":data.password}
request.session.set_expiry(60 * 60 * 24 * 7)
return redirect('/user/list/')
return render(request, 'login1.html', {"error_msg": "用户名或错误"})
三、注销函数
代码如下(示例):
def logout(request):
request.session.clear()
return redirect('/login/')
path('logout/', views.logout),
四、传信息到页面
user_list.html 加入登录信息, 为什么能直接调用?应为return render(request,)就已经传入了request参数
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div>
<div>数据列表</div>
<div>登录用户:
<label>{{request.session.info.username}}</label>
<a href="/logout/">注销</a>
</div>
<hr>
<div>
<a href="/user/add/">添加</a>
</div>
<table >
<tbody>
{% for admin in data %}
<tr>
<td>{{admin.id}}</td>
<td>{{admin.username}}</td>
<td>{{admin.password}}</td>
<td>
<a href="/user/edit/{{admin.id}}/">编辑</a>
<a href="/user/delete/{{admin.id}}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</body>
</html>
user_add.html 等也加入登录信息,来验证session是否保持
五、验证结果
未登录时页面没有显示具体的登录用户 接下来我们用南藤这个用户登录 登录成功后的用户列表页面 登录成功后的添加用户页面以及编辑用户页面
六、总结
本次主要用了request.session来保存登录时的信息。
|