Django的Cookie And Session介绍
2021-06-10 本文已影响0人
Chris0Yang
Cookie
web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术
image.png image.png
Django中Cookie的语法
设置cookie
rep.set_cookie(key,value,...)
rep.set_migned_cookie(key,value,salt='加密',......)
获取cookie
request.COOKIES.get(key)
删除cookie
rep = HttpResponse || render || redirect
rep.delete_cookie(key)
image.png
简单验证Cookie方式
def login(request):
if request.method == "GET":
return render(request, "login.html")
else:
username = request.POST.get("username")
pwd = request.POST.get("pwd")
# 第一:固定的用户密码去连接数据库
# if username == "admin" and pwd == "123":
# rep = redirect("/index/") # redirect 是指定跳转页面
# rep.set_cookie("is_login", True)
# print(rep)
# return rep
# else:
# return redirect("/login/")
# 第二:进行数据库认证用户账号和密码
models.User.objects.filter(name=username, pwd=pwd).first()
rep = redirect("/index/") # redirect 是指定跳转页面
rep.set_cookie("is_login", "XXXXX") # True是明文形式,建议是使用密文
rep.set_signed_cookie("secret", "XXXX", "salt")
print(rep)
return rep
def index(request):
# 收到浏览器的再次请求,判断浏览器携带的cookie,是不是登录成功的时候相应的cookie
status = request.COOKIES.get("is_login")
if not status:
return redirect("/login/")
return HttpResponse("index")
def logout(request):
rep = redirect("/login/") # redirect 是指定跳转页面
rep.delete_cookie("is_login")
return rep # 点击注销后执行,删除cookie,不再保存用户状态,并弹到登录页面
def order(request):
print(request.COOKIES.get("is_login"))
status = request.COOKIES.get("is_login")
if not status:
return redirect("/login/")
return render(request, "order.html")
Session
Cookie 和 Session有什么区别?
为啥会用Session,是因为cookie保存数据是有限制,默认的4096字节,而且将一些敏感数据保存到客服端是最不安全的。因此,我们需要将数据保存到服务端数据库中,这样数据长度不受限制,并且相对安全。
cookie弥补 HTTP 无状态的不足,让服务器知道来的人是 " 谁 ",但是cookie以文本的形式保存在浏览器也就是客户端,安全性较差,且最大只支持4096字节,所以只通过cookie识别不同的用户,然后,在对应的session里保存私密的信息,以及超过4096字节的文本。
session 原理
1)浏览器第一次请求获取登录页面login
2)浏览器输入账号密码第二次请求,若输入正确,服务器响应浏览器一个index页面和一个键为sessionid,值为随机字符串的cookie,即set_cookie("session",随机字符串)
3)服务器内部在django.session表中记录一条数据
- dajango.session表中有三个字段
- session_key: 存的是随机字符串,即响应给浏览器的cookie的sessionid键对应的值
- session_data: 存的是用户信息,即多个request.session[“key”]=value,且是密文
- expire_date: 存的是该条记录的过期时间(默认时间14天)
4)浏览器第三次请求其他资源时,携带cookie:{ sessinoid:随机字符串 },服务器从django.session表中根据该随机字符串取出该用户的数据,供其使用(即保存状态)
注意:django.session表中保存的是浏览器信息,而不是每一个用户的信息。因此,同一浏览器多个用户请求只保存一条记录(后面覆盖前面),多个浏览器请求才保存多条记录。
session保存位置:djago-session表
1)保存在服务端,没有任何大小限制
2)可以在Redis保存Session
# Redis在django中的settings配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
# "PASSWORD": "123",
}
}
}
# Session的存储配置
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
# 设置Session失效时间,单位为秒
SESSION_COOKIE_AGE = 60*5
Django Session 使用方式
def login(request):
if request.method == "GET":
return render(request, "login.html")
else:
username = request.POST.get("username")
pwd = request.POST.get("pwd")
# Session验证登录
if username == "admin" and pwd == "123":
# request.session会向浏览器客户端写入cookie的值,键默认是sessionid,同时也会保存数据会到保存到session表中
request.session["is_login"] = True
request.session["user01"] = username
return redirect("/index/")
else:
return redirect("/login/")
def index(request):
# 收到浏览器的再次请求,判断浏览器携带的cookie,是不是登录成功的时候相应的cookie
status = request.session.get("is_login")
if not status:
return redirect("/login/")
return HttpResponse("index")
def logout(request):
# request.session["is_login"] # 删除session_data里的一组键值对
request.session.flush() # 删除一条记录包括(session_key session_data session_date)三个字段
return redirect("/login/")
Django使用Redis保存Session
# Redis在Django中的配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
# "PASSWORD": "123",
}
}
}
# session的存储配置
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
# 设置session失效时间,单位为秒
SESSION_COOKIE_AGE = 60*5