一、什么是会话
会话: 指从浏览器访问一个网站,到关闭浏览器结束此次访问,称为一次会话。而HTTP协议是无状态的,导致会话难以持续保持。若不能保持会话,我们在浏览网站就会经常性的登录,或者重复支付等等。
Cookies与Session就是为保持会话状态而诞生的两个存储技术。
cookies是保存在客户端浏览器的存储空间,在chrome浏览器如图位置显示。
二、Cookies
2.1 Cookies的简介
- Cookies是储存在浏览器以键值对形式进行存储的,键和值都是以ASCII字符串形式存储
- 存储的数据带有生命周期
- cookies中的数据是按域存储隔离的,不同的域之间无法访问
- cookies的内部数据会在每次访问到此网址时都会携带到服务器端,若cookies较大会降低响应速度
2.2 Cookies的使用
- cookies----存储
HttpResponse.set_cookie(key: Any,value: str = '',
max_age: Any = None,
expires: Any = None)
- key:cookie的名字
- value:cookie的值
- max_age:存活时间,单位是秒
- expires:具体过期时间
- 当不指定max_age与expires时,关闭浏览器时此数据失效
- Cookies----获取
# 通过request.COOKIES绑定的字典获取客户端的COOKIES数据
value = request.COOKIES.get(key,"默认值") # 若key不存在,则返回默认值
- Cookies----删除
- HttpResponse.delete_cookie(key)
- 删除指定key的Cookies,若key不存在则什么也不发生
- Cookies会话保持登录流程
三、Session
3.1 Session的简介
-
cookie是将数据存储在浏览器上,而session是将数据存储在服务器上。
-
session是在服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据。
实现方式:
- 使用session需要在浏览器客户端启动cookie,且在cookie中存储sessionid
- 每个客户端都可以在服务器端有一个独立的Session
- 不同的请求者之间不会共享这个数据,与请求者一一对应
3.2 Session的使用
session对象是一个类似于字典的Session Store类型对象,可以类似于字典的方式进行操作。session能够存储字符串、整型、字典、列表等。
- 保存Session值到服务器:
request.session["KEY"] = VALUE # dict
- 获取session的值
value = request.session["KEY"]
value = request.session.get("KEY","DEFAULT_VALUE") # 推荐使用
- 删除session
del request.session["KEY"]
- settings.py相关配置项
# 1.指定sessionid在cookies中的保存时常(默认是两周)
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
# 2.设置只要浏览器关闭,session就失效,默认为False
SESSION_EXOIRE_AT_BEOWSER_CLOSE = True
注意: Django 中的 session 数据存储在数据库中,所以使用session前需要确保已经执行过迁移命令。
py manage.py makemigrations
py manage.py migrate
3.3 Django session存在问题
- django_session表示单表设计;该数据量会是持续增长的,因浏览器故意删除掉sessionid&过期数据未删除;
- 可通过设置定时任务来执行删除过期的session数据
py manage.py clearsessions
cookies与session的对比
种类 | 存储位置 | 安全性 |
---|---|---|
cookies | 浏览器 | 相对不安全 |
session | 服务器 | 相对安全 |
四、Cookies与Session会话保持流程
![](https://i-blog.csdnimg.cn/blog_migrate/ed56d9807081474b6d259043a94851f8.png#pic_center)
4.1 session与cookies实线自动登录
def login(request):
if request.method == "POST":
# 检查登录状态,若果登录了,显示已登录
if requset.session.get("username") and request.session.get("uid"):
return HttpResponse("用户已登录")
username = request.COOKIES.get("username")
uid = request.COOKIES.get("uid")
elif username and uid:
# 若cookies存在,则此时需要保存session,称为回写session
request.session["username"] = username
request.session["uid"] = uid
return HttpResponse("用户已登录")
else:
return render(request,"login.html")
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
{% if request.session.username %}
<p>hello,{{ request.session.username }}</p>
<p><a href="/user/exit">退出登录</a></p>
<p><a href="">我的笔记</a></p>
{% else %}
{% if request.COOKIES.username %}
<p>hello,{{ request.COOKIES.username }}</p>
<p><a href="/user/exit">退出登录</a></p>
<p><a href="">我的笔记</a></p>
{% else %}
<a href="/user/login_view">登录</a>
<a href="/user/reg_view">注册</a>
{% endif %}
{% endif %}
</body>
</html>
4.2 session与cookie实现校验登录状态
- 核心方法:利用Python装饰器
4.3 Python装饰器
闭包: 在函数中再嵌套一个函数,并且引用外部函数的变量。
def outer(X):
def inner(y):
return x + y
return inner
outer函数内,又定义了一个inner函数,并且inner函数又引用了外部函数outer的变量x,这就被称为一个闭包了。输出时,outer(6)(5),第一个括号传进去的值返回inner函数,其实就是6 + y,所以在传入第二个参数进去,就可以得到返回值,6 + 5。即第一个括号为外层参数,第二个货号为内层参数。
装饰器: 其实就是一个闭包,是闭包的一种应用。Python装饰器是用于拓展函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用Python装饰器的好处就是不用改变原函数的代码的前提下,给函数增加新的功能,使用时只需要在前面加上@demo即可。
def debug(func):
def wrapper():
print("[DEBUG]:enter{}()".format(func.__name__))
return func()
return wrapper
@debug
def hello():
print("hello")
hello()
例中装饰器给函数加上进入函数的debug模式,不修改原函数代码就完成这个功能。
# 装饰的函数当然也是可以传参数的。
def logging(level):
def outwrapper(func):
def wrapper(*args, **kwargs):
print("[{0}]: enter {1}()".format(level, func.__name__))
return func(*args, **kwargs)
return wrapper
return outwrapper
@logging(level="INFO")
def hello(a, b, c):
print(a, b, c)
hello("hello,","good","morning")