Django-Cookie和Session

all right,Cookie🍪 和 Session 并不是 Python 中特有的东西,只是我在学习 Django 框架的时候才搞清楚了其工作方式,所以记录在此。

在和学长写项目的过程中,只是有所了解,并不知道这是哪块小饼干,什么味道。

一直在用 GitHub,发现 GitHub 可以好久不用登陆,今天搞清楚了 Cookie 和 Session 的方式后打开 GitHub 看了下,明白liao~

访问 GitHub

先说下状态保持吧。HTTP 协议是无状态的,下一次去访问一个页面并不知道上一次对这个页面做了什么东西。

所以就需要双方(浏览器和服务器)写一些小纸条记着。Cookie 和 Session 就是这两个人写的小纸条。

Cookie 是由服务器生成,存储在浏览器端的一小段文本信息。

Cookie 的特点:

  1. 以键值对方式进行存储;
  2. 通过浏览器访问一个网站时,会将浏览器存储的跟此网站相关的所有 Cookie 信息在请求的时候发给该网站的服务器;
  3. Cookie 是域名安全的;
  4. Cookie 是由过期时间的,如果服务器不指定,默认关闭浏览器之后 Cookie 就会过期。

Cookie

Django 设置和读取 Cookie:

1
2
3
4
5
6
7
8
9
10
11
12
13
"""views.py"""
def set_cookie(req):
"""设置cookie 信息"""
resp = HttpResponse('设置 cookie')
# 设置一个 cookie,名字为 num,值为 1,两周之后过期
resp.set_cookie('num', 1, max_age=14 * 24 * 3600)
# resp.set_cookie('num', 1, expires=datetime.now()+timedelta(days=14)) # 与上同理
return resp

def get_cookie(req):
"""获取 cookie 信息"""
num = req.COOKIES['num']
return HttpResponse(num)

设置 Cookie

得到的 Cookie 里的值

Django 用户登录案例,Cookie 保存用户名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
"""views.py"""

def login(req):
"""登录页面"""
# 获取 cookie 中的 username
if 'username' in req.COOKIES:
username = req.COOKIES['username']
else:
username = ''

return render(req, 'booktest/login.html', {'username': username})

def login_check(req):
"""登录验证"""
"""req.POST 保存 post 提交的参数, req.Get 保存 get 提交参数,参数类型都是 QueryDict 类型的对象"""
# 获取提交的用户名和密码
username = req.POST.get('username')
password = req.POST.get('password')
remember = req.POST.get('remember') # on / None
# 校验,根据用户名密码查找数据库
if username == 'ahojcn' and password == '200212':
resp = redirect('/booktest/index')
# 判断是否需要记住用户名
if remember == 'on':
resp.set_cookie('username', username, max_age=7 * 24 * 3600) # 记住 1 周
# 用户名密码正确,跳转到首页
return resp
else:
# 用户名或密码错误,跳转到登录页面
return redirect('/booktest/login')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!-- login.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form method="post" action="login_check">
<label>
用户名:
<input type="text" name="username" value="{{ username }}">
</label><br>
<label>
密码:
<input type="password" name="password">
</label><br>

<label>
<input type="checkbox" name="remember">
</label>记住用户名<br>

<input type="submit" value="登录">
</form>
</body>
</html>

记住用户名

Session

Session 类似于我们老家镇子上的超市的做法。

我办了一张会员卡,会员号是我的手机号,每次我买完东西结账小姐姐总会问:“有会员嘛?会员号多少?(手动陕西话)”。我说:xxxxxx。

我的会员信息保存在小姐姐他们的电脑上,她给了我会员号。

Session 的特点:

  1. Session 存储在服务端,以键值对进行存储的;
  2. Session 依赖于 Cookie,唯一的标识码保存在 cookie 中;
  3. Session 也是有过期时间,如果不指定,默认是两周过期。

Django 设置和获取 Session:

1
2
3
4
5
6
7
8
9
10
11
12
13
"""views.py"""

def set_session(req):
"""设置 session"""
req.session['username'] = 'ahojcn'
req.session['age'] = 19
return HttpResponse('设置 session')

def get_session(req):
"""获取 session"""
username = req.session['username']
age = req.session['age']
return HttpResponse(username + ":" + str(age))

set session

get session

记住用户登录状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
"""views.py"""

def login(req):
"""登录页面"""
# 判断用户是否登录
if req.session.has_key('islogin'):
# 已登录,跳转到首页
return redirect('/booktest/index')
else:
# 获取 cookie 中的 username
if 'username' in req.COOKIES:
username = req.COOKIES['username']
else:
username = ''

return render(req, 'booktest/login.html', {'username': username})


def login_check(req):
"""登录验证"""
# 获取提交的用户名和密码
username = req.POST.get('username')
password = req.POST.get('password')
remember = req.POST.get('remember') # on / None
# 校验,根据用户名密码查找数据库
if username == 'ahojcn' and password == '200212':
resp = redirect('/booktest/index')
# 判断是否需要记住用户名
if remember == 'on':
resp.set_cookie('username', username, max_age=7 * 24 * 3600) # 记住 1 周
# 记录用户登录状态
req.session['islogin'] = True
# 用户名密码正确,跳转到首页
return resp
else:
# 用户名或密码错误,跳转到登录页面
return redirect('/booktest/login')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!-- login.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form method="post" action="login_check">
<label>
用户名:
<input type="text" name="username" value="{{ username }}">
</label><br>
<label>
密码:
<input type="password" name="password">
</label><br>

<label>
<input type="checkbox" name="remember">
</label>记住用户名<br>

<input type="submit" value="登录">
</form>
</body>
</html>

test

应用场景

cookie:记住用户名之类的,安全性要求不高用。

session:涉及到安全性要求比较高的数据用。


文章作者: ahoj
文章链接: https://ahoj.cc/2019/07/Django-Cookie和Session/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ahoj 的小本本