django ——cookie与session
django ——cookie与session
cookie与session
cookie与session简介
cookie与session是类似于装饰器,对路由进行操作管理,所以需要先了解HTTP协议
-
HTTP协议四大特性
①基于请求响应
②基于TCP、IP作用于应用层之上的协议
③无状态
④无连接
-
什么是无状态
无状态就是服务端无法识别客户端的状态
-
无状态的发展历程
起初所有人访问网址都是一样的数据,服务端无法识别客户端
随着互联网的发展,服务端不得不想办法记住客户端的状态,于是诞生了cookie和session用来绑定每个用户,记录每个用户的状态
-
-
cookie简介
保存在客户端上跟用户信息(状态)相关的数据
cookie的原理:
由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断具体是哪个用户了。
-
session简介
保存在服务端上跟用户信息(状态)相关的数据
session的原理:
session是基于cookie而来的,等于是将cookie所绑定的数据进行加密,增添安全性,使其在前端和数据库看到的数据是密文的形式,从而达到双重加密的作用
注意:
1.session的工作需要依赖于cookie、就算是目前所有能够识别用户身份的网址也都需要使用cookie
2.客户端浏览器也有权拒绝保存cookie
Django中操作cookie
获取Cookie
request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数default 表示的是默认值
salt是后序的加盐处理
max_age是后台控制的过期时间,默认时间是14天
客户端浏览器保存cookie
视图函数返回值都是需要一个HttpResonse,我们想要操作cookie,就不能直接返回对象,而是先用变量名指代,后操作对象方法
obj = HttpResponse()
obj.操作cookie的方法
return obj
obj = render()
obj.操作cookie的方法
return obj
obj = redirect()
obj.操作cookie的方法
return obj
obj = JsonRepsonse()
obj.操作cookie的方法
return obj
基本使用
obj.set_cookie() # 设置
obj.COOKIE.get() # 获取
cookie的其他操作
set_cookie(key,value,salt='加密盐') # 加密盐
# 会在value后面产生一个随机字符串eg:1ntTFz:bFkwr34ztzsHQLU1qYp
set_cookie(key,value,max_age=超时时间:默认是秒数) # 后台控制过期时间
# expires:专门针对IE浏览器设置超时时间
# 删除Cookie
# HttpResponse对象.delete_cookie(key)
def logout(request):
rep = redirect("/login/")
rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值
return rep
实例:登录功能
1.登录设置cookie
2.多个视图函数都需要校验用户是否登录
装饰器
3.如何记住用户登录之前想要访问的页面 用户登录成功之后自动跳转
场景1:用户访问了其他需要登录才可以访问的页面 如何跳转>>>:想要访问的
场景2:用户直接访问的登录页面 如何跳转>>>:网址首页
request.path # 只能获取路由后缀
request.path_info # 只能获取路由后缀
request.get_full_path() # 不仅能获取路由后缀,还能获取后缀问号后面的数据
# 登录校验装饰器
def login_auth(func_name):
def inner(request, *args, **kwargs):
if request.COOKIES.get('name'):
res = func_name(request, *args, **kwargs)
return res
else:
# 获取路由访问的后缀
target_path = request.path_info
# 给路由后缀带上想要访问的网址后缀数据
return redirect(f'/login/?next={target_path}')
return inner
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jason' and password == '123':
target_path = request.GET.get('next')
if target_path:
obj = redirect(target_path) # 如果有值则跳转到指定页面
else:
obj = redirect('/home/') # 如果没有值则跳转到首页
obj.set_cookie('name', 'jasonNB')
return obj
return render(request, 'login.html')
@login_auth
def home(request):
return HttpResponse('home页面 只有登录的用户才可以查看')
@login_auth
def index(request):
return HttpResponse('index页面 只有登录的用户才可以查看')
@login_auth
def func(request):
return HttpResponse('func页面 只有登录的用户才可以查看')
Django中操作session
请求来之后服务端产生随机字符串并发送给客户端保存 服务端存储随机字符串与用户信息的对应关系 之后客户端携带随机字符串 服务自动校验
针对保存 django需要一张表来处理:django_session
表,即django数据库迁移命令会产生一堆默认的表,其中就有一张django_session表、里面只有三个字段(session_key
,session_data
,expire_date
)。
-
设置
request.session['key'] = value # 可以设置多组 1.django自动产生一个随机字符串返回给客户端(对name加密) 2.往django_session表中创建数据(对jason加密) 3.sessionid:随机字符串
-
获取
request.session.get('key') # 可以获取多组 1.自动从请求中获取sessionid对应的随机字符串 2.拿着随机字符串去django__session表中匹配数据 3.如果匹配上还会自动解密数据并展示
-
注意事项
1.django默认的session失效时间是14天
2.客户端会接受到键值对,键默认是sessionid值是加密的随机字符串
-
session其他操作
request.session.session_key # 获取产生的随机字符串 request.session.delete() # 只删客户端 request.session.flush() # 服务端和客户端都删 request.session.set_expiry(value) # 设置超时时间
1.如果value是个整数,session会在些秒数后失效
2.如果value是个datatime或timedelta,session就会在这个时间后失效
3.如果value是0,用户关闭浏览器session就会失效
4.如果value是None,session会依赖全局session失效策略
-
针对session数据的存储位置,有五种方案
1. 数据库Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 2. 缓存Session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 3. 文件Session SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存+数据库 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)