会话技术
出现场景:
1、服务器如何识别客户端
2、Http在Web开发中都是短连接
请求生命周期:
1、从Request开始
2、到Response结束
种类:
1、Cookie
2、Session
3、Token
Cookie
本质是存储在客户端的键值对
支持过期时间,默认Cookie会自动携带
Cookie不支持中文
设置Cookie:
def set_cookie(request):
response = HttpResponse('设置Cookie')
response.set_cookie('username', 'Rock') # 'username'作为键,'Rock作为值'
return response
获取Cookie的值:
def get_cookie(request):
username = request.COOKIES.get('username')
return HttpResponse(username)
一个简单的登录页面(基于Cookie)
思考:
<body>
<form action="{% url 'app:login' %}" method="post">
{% csrf_token %}
<p>用户名:<input type="text" placeholder="请输入用户名" name="uname"></p>
<p>密码:<input type="password" placeholder="请输入密码" name="pwd"></p>
<button>登录</button>
</form>
</body>
个人中心页面 mine.html 如下:
<body>
<h1>欢迎登录,{{ uname }}</h1>
</body>
后台视图函数做验证,如果用户名和密码正确,则登录成功,设置cookie,然后跳转到个人中心页面。如果登录失败,则显示用户名或密码错误。
views.py 如下:
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
username = request.POST.get('uname')
password = request.POST.get('pwd')
if username == 'lxyker' and password == '123456':
response = redirect('app:mine')
response.set_cookie('uname', username)
response.set_cookie('pwd', password)
else:
response = HttpResponse('用户名或密码错误')
return response
def mine(request):
uname = request.COOKIES.get('uname')
if uname:
return render(request, 'mine.html', {'uname': uname})
else:
return redirect('app:login')
cookie过期时间
cookie默认关闭浏览器立即过期,不能跨浏览器
# cookie在60秒后过期
response.set_cookie('uname', username, max_age=60)
加盐:
# 加盐 'hahaha' 就是加入的盐
response.set_signed_cookie('uname', username, 'hahaha')
获取时,要用相应的盐才能获取到数据:
uname = request.get_signed_cookie('uname', salt='hahaha')
删除cookie:
response.delete_cookie('uname')
Session
Session存储:
request.session['username'] = uname
获取session:
username = request.session.get('username')
过期时间:
Django中Session的默认过期时间是14天
账户退出:
删除Cookie中的sessionid
response.delete_cookie('sessionid')
删除Session:
del request.session['username']
删除Cookie和Session(这种方法无垃圾数据):
request.session.flush()