网站开发程序用什么好,沈阳科技网站建设,福州网站建设金森,微信小商店和小程序商城的区别Django Cookie和Session
【一】介绍
【1】起因
HTTP协议四大特性 基于请求响应模式#xff1a;客户端发送请求#xff0c;服务端返回响应基于TCP/IP之上#xff1a;作用于应用层之上的协议无状态#xff1a;HTTP协议本身不保存客户端信息短链接#xff1a;1.0默认使用短…Django Cookie和Session
【一】介绍
【1】起因
HTTP协议四大特性 基于请求响应模式客户端发送请求服务端返回响应基于TCP/IP之上作用于应用层之上的协议无状态HTTP协议本身不保存客户端信息短链接1.0默认使用短链接请求-响应后断开连接 因为无状态 导致客户端和服务端无法正常长时间的通讯所以需要一种方法来打破这种情况 Cookie和Session是Web开发中常用的两种持久化会话状态的方法
【2】Cookie和Session
1介绍 cookie Cookie是服务器发送到用户浏览器并保存在浏览器上的一块数据他会在浏览器下一次向服务器发送请求时被携带并发送到服务器上 session Session是另一种保存用户数据的方法但数据是保存到服务器端的Session通过生成一种叫做Session ID的唯一标识符保存在cookie中或者通过URL传递以便在多个请求中可以识别和跟踪用户
2关系
session和cookie的主要关系是 session通常使用cookie来存储Session ID以便在多个请求之间跟踪用户但是也可以通过其他方式URL
3异同
存储位置 cookie存储在客户端session存储在服务端 安全性 由于cookie存在客户端所以安全性较低如果信息是密码这种敏感信息还是用session 生命周期 cookie可以设置过期时间如果不设置时间那么关闭浏览器时cookie就会被删除session的生命周期通常由服务器设置当用户关闭浏览器并长时间误操作session也会过期然后删除 存贮容量 cookie的大小通常有限制4KBsession理论上是没有大小限制的
【二】Django操作cookie
【1】语法
以HttpResponse为例另外的两把斧也可以
1设置cookie
http_res HttpResponse()
http_res.set_cookie(key, value)2获取cookie
request.COOKIES.get(key)3设置过期时间
不指定这个参数的话 那么cookie将是会话Cookie即在浏览器关闭后会被删除 max_age默认单位是秒 可以使用datetime模块的timedelta快速换算单位max_age timedelta(days1).total_seconds() IE浏览器使用expires这个参数
http_res HttpResponse()
http_res.set_cookie(key, value, max_age)4注销cookie
http_res HttpResponse()
http_res.delete_cookie(key)视图层
def get_cookie(request):res request.COOKIES.get(name)print(res)return HttpResponse(res)def set_cookie(request):http_res HttpResponse()# 浏览器关闭后会被删除http_res.set_cookie(name, bruce)# 5秒后这个cookie会被删除# http_res.set_cookie(name, bruce, max_age5)# 注销cookieres http_res.delete_cookie(name)print(res)return http_res 【2】示例
1装饰器登录功能
要求 功能界面func需要登录才可以使用 如果没有登录就跳转到登录界面 登录完成以后自动跳转到主页主页不需要进行登录验证 前端登录 其他界面显示文字即可直接HttpResponse
form action methodpostpusername: input typetext nameusername/pppassword: input typepassword namepassword/pbutton class提交/button
/form视图层 login_decorator登录验证装饰器login登陆函数home主界面func1、 func2功能界面
def login_decorator(func):def inner(request, *args, **kwargs):if request.COOKIES.get(login_info):res func(request, *args, **kwargs)return resreturn redirect(/login/)return innerdef login(request):if request.method POST:username request.POST.get(username)password request.POST.get(password)# 正常需要和数据库数据校验# 这里简单一点if username bruce and password 000:response redirect(/home/)response.set_cookie(login_info, username password)return responsereturn render(request, login.html, locals())def home(request):return HttpResponse(主页)login_decorator
def func1(request):return HttpResponse(func1)login_decorator
def func2(request):return HttpResponse(func2)2页面跳转登录功能
在原先的基础上 加上那个界面触发的登录在登录成功以后返回到那个界面精髓发送POST请求带上GET请求的内容
def login_decorator(func):def inner(request, *args, **kwargs):next_url request.get_full_path()if request.COOKIES.get(login_info):res func(request, *args, **kwargs)return resreturn redirect(f/login/?next{next_url})return innerdef login(request):# http://127.0.0.1:8000/login/?next/func1/# 此时发送的是POST请求# 但是携带了get的内容if request.method POST:username request.POST.get(username)password request.POST.get(password)# 正常需要和数据库数据校验# 这里简单一点if username bruce and password 000:next_url request.GET.get(next)next_url next_url if next_url else /home/response redirect(next_url)response.set_cookie(login_info, username password)return responsereturn render(request, login.html, locals())【三】Django操作session
【0】准备
session是保存在服务器的那么Django就需要一个文件来保存session数据这个文件就是在数据迁移时自动创建的表单django_sessoin即如果新项目想要使用session需要先迁移一下数据
【1】语法
1设置session
内部执行过程 产生一个随机字符串保存随机字符串和加密数据最后将随机字符串返回给浏览器存储在cookie中 格式sessionid:随机字符串 添加多个键值对数据 最终还是对应一个sessionid
request.session[key] value2获取session
内部执行过程 获取客户端发来的随机字符串去存储session的django_sessoin表单中对比查询随机字符串比对成功自动解密处理数据根据key找value比对失败则request.session中的数据为None
request.session.get(key)3设置过期时间
value是整数多少秒过期value是日期对象datetime.datetime 对象会话将在这个指定的日期和时间过期。value是0退出浏览器窗口就过期不设置(None)过期策略将依赖于全局session配置 这是django的settings的文件中的session_cookie_age配置默认是14天 可以不设置设置了就必须要给值过期会删除客户端和服务端的session但是 客户端的自动删除了服务端的出于性能考虑并不会立即删除过期的session数据。可以手动clearsessions 命令来手动清理过期的session。
request.session.set_expiry(value)4清空session
delete() 清除当前用户所在服务端的session数据但是会保留session的键key如果下次用户来访问时session没有被填充那么返回的就是一个空的session对象
request.session.delete()flush() 完全删除当前用户的所有session对象和相关数据包括服务端和客户端
request.session.flush()5多值和多session 同一个用户创建多个数据 报错的只有一个sessionid 同一个计算机同一个浏览器对应相同的sessionid 同一个计算机不同浏览器对应不同的sessionid 当session过期时可能出现多个sessionid对应同一个浏览器 但是过期的数据不会持久化存储会被定时清理掉目的是为了节省服务器资源手动清理clearsessions 命令 视图层
def get_session(request):res1 request.session.get(sign)print(fsession第一个数据:{res1})res2 request.session.get(flag)print(fsession第一个数据:{res2})return HttpResponse(获取session成功)def set_session(request):# session添加多个键值对还是保存在一个sessionid中request.session[sign] hellorequest.session[flag] True# 十秒后自动清除客户端和服务端的session# request.session.set_expiry(10)# 关闭浏览器就清除# request.session.set_expiry(0)return HttpResponse(添加session成功)【2】Django配置
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 # 引擎其他公用设置项
SESSION_COOKIE_NAME sessionid # Session的cookie保存在浏览器上时的key即sessionid随机字符串默认
SESSION_COOKIE_PATH / # Session的cookie保存的路径默认
SESSION_COOKIE_DOMAIN None # Session的cookie保存的域名默认
SESSION_COOKIE_SECURE False # 是否Https传输cookie默认
SESSION_COOKIE_HTTPONLY True # 是否Session的cookie只支持http传输默认
SESSION_COOKIE_AGE 1209600 # Session的cookie失效日期2周默认
SESSION_EXPIRE_AT_BROWSER_CLOSE False # 是否关闭浏览器使得Session过期默认
SESSION_SAVE_EVERY_REQUEST False # 是否每次请求都保存Session默认修改之后才保存默认【3】示例
1页面跳转登录
和cookie的基本一样就是cookie改成session
def login_decorator(func):def inner(request, *args, **kwargs):next_url request.get_full_path()if request.session.get(login_info):res func(request, *args, **kwargs)return resreturn redirect(f/login/?next{next_url})return innerdef login(request):# http://127.0.0.1:8000/login/?next/func1/# 此时发送的是POST请求# 但是携带了get的内容if request.method POST:username request.POST.get(username)password request.POST.get(password)# 正常需要和数据库数据校验# 这里简单一点if username bruce and password 000:next_url request.GET.get(next)next_url next_url if next_url else /home/response redirect(next_url)# response.sess(login_info, username password)request.session[login_info] f{username}-{password}return responsereturn render(request, login.html, locals())