django学习第十一天---django操作cookie和session
1|0Cookie
1|1cookie解析
会话 http协议是无状态的,无连接的 导致每次客户端访问服务端需要登录成功之后才能访问的页面,都需要用户再重新登录一遍,用户体验极差。 客户端想了个办法,cookie,小甜点 浏览器第一次请求携带的cookie为{},服务器设置cookie并返回给浏览器,浏览器第二次请求携带服务器返回的cookie 客户端保存cookie是保存在本地,本地有cookie文件。请求的时候会查看本地是否有存储的这个服务端的cookie,如果有,每次请求都自动带上这些cookie 查看响应回来的cookie 浏览器打开F12在Network查看响应回来的cookie 第一次请求服务端,服务端设置了一组cookie键值对,如name=xiaoxin,那么响应回来的数据会带着这组键值对给客户端,客户端将这一组数据保存到了客户端本地,那么下次再访问这个服务端,会自动带着这一对cookie数据
2|0django操作cookie
- 示例
next_url = '' def login(request): if request.method == 'GET': return render(request,'login.html') else: uname = request.POST.get('username') if uname == 'root': ret = redirect('/home/') #设置cookie ret.set_cookie('is_login',True) # ret.set_cookie('is_login',True,max_age=5) max_age最长维持5秒后过期 ret.set_cookie('name','root') return ret else: return render(request,'login.html') def home(request): return render(request,'home.html') #基于cookie做登录认证,判断用户是不是已经登录过了 def person(request): #获取cookie,来判断cookie的值 #跳转回原页面的简单示例 global next_url next_url = request.path print(request.COOKIES)#获取请求的cookie 普通字典类型,里面所有的值都是字符串 is_login = request.COOKIES.get('is_login') if is_login == 'True': ret = render(request,'person.html') ret.delete_cookie('name') return ret else: return redirect('/login/') #注销 def logout(request): ret = redirect('/login/') ret.delete_cookie('is_login') return ret #获取cookie request.COOKIES.get('is_login') #cookie类型与一个字典,所以根据键取值 #设置cookie ret = redirect('/home/') ret.set_cookie('is_login',True,max_age=5)#5秒后cookie过期 ret.set_cookie('name','root')#如设置同名的cookie,就是修改cookie #设置签名cookie,就是加盐 ret.set_signed_cookie('name','root',salt='saddas') #获取签名cookie ret.get_signed_cookie('name',salt='asdsa')#以防cookie在传输过程中被人修改了 #删除cookie ret.delete_cookie('is_login')
3|0设置cookie时的一些参数
参数: key,键 value='',值 max_age=None,超时时间 值一个数字,单位是秒 expires=None,超时时间(IE requires expires, so set it if hasn't been already.)值是日期时间类型数据 path='/',Cookie生效的路径,/表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 当:path='/index', 127.0.0.1:8001/home cookie不生效,获取不到 127.0.0.1:8001/index/xxx/xx/ggg 生效,凡是访问/index路径下面的子路径,都能获取到这个cookie domain=None,Cookie生效的域名 secure=False,https传输 httponly=False,只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
4|0cookie特点
1.Cookie大小上限为4kb 2.一个服务器最多在客户端浏览器上保存20个Cookie 3.一个浏览器最多保存300个Cookie,因为一个浏览器可以访问多个服务器 4.cookie是明文存储在客户端的,不安全,所以一些敏感数据是不应该放到cookie里面的 上面的数据只是HTTP的Cookie规范,但在浏览器大战的今天,一些浏览器为了打败对手,为了展现自己的能力,可能对Cookie规范'扩展'了一些,例如每个Cookie的大小为8kb,最多可保存500个Cookie等,但也不会出现把你硬盘沾满的可能。 注意,不同浏览器之间是不共享Cookie的,也就是说在你使用IE访问服务器时,服务器会把Cookie发给IE,然后由IE保存起来,当你在使用FireFox访问服务器时,不可能把ie保存的Cookie发送给服务器。
5|0Session
- 简介
针对以上特点cookie有数据大小限制,还明文存储在客户端,出现了session技术,session技术就是为了提升上面两个特点。基于cookie技术(目前先这样里面,其实不通过cookie也能完成session技术)
- 特点
1.基于cookie时,也是以键值对的形式来存的数据,但是数据是密文的,只是一把钥匙(随机字符串) 2.真正的数据是报错在服务端的,将来通过cookie带过来的这个随机字符串,来找到服务端保存的对应用户的数据,数据既然是保存在服务端的,那么数据的大小没有限制 session解析: 浏览器第一次请求携带的cookie:{},服务器接收请求,并设置session如request.seesion['username']='yuan',然后存到django-session表中,session-key表示设置的秘钥,session-data存的是设置的键值对数据{'username':'yuan'},然后把session-key返回给浏览器set_cookie:sessionid=123sadfddf,浏览器第二次请求时,携带cookie:{sessionid=123sadfddf}去请求服务器。
6|0django的session操作
- 示例
def login(request): if request.method == 'GET': return render(request,'login.html') else: uname = request.POST.get('username') if uname == 'root' or uname == 'liu': request.session['is_login'] = True request.session['username'] = uname ''' request.session['is_login'] = True 做了三件事 1.生成一个随机字符串,并将这个字符串添加到了cookie里面,键值对名称是这样的:sessionid:asdasdasd 2.将is_login和username这两个键值对数据{'is_login':True,'username':'root'}首先进行了序列化,然后进行了加密,然后将加密后的数据和sessionid对应的随机值保存到了django-session表中 3.给session保存的数据,加了有效期,默认是两周 ''' return redirect('/home/') else: return render(request,'login.html') def home(request): return render(request,'home.html') def person(request): print(request.session) #取值 is_login = request.session.get('is_login') ''' request.session.get('is_login') 1.去cookie里面取出sessionid这个键对应的值(随机字符串) 2.通过这个随机字符串去django-session表里面获取对应的数据,session-data那一列的数据 3.对数据进行解密和反序列化,得到{'is_login':'True','username':'root'}然后通过键取出对应的值 ''' print(is_login,type(is_login)) if is_login == True: return render(request,'person.html') else: return redirect('login') def logout(request): request.session.flush() ''' 1.删除cookie中的sessionid值 2.删除django-session表中保存的数据记录 ''' return redirect('/login/')
- 操作
设置值 request.session['is_login'] = True #等于别的值就是修改动作 request.session['username'] = 'root' ''' request.session['is_login'] = True 做了三步事情 1.生成一个随机字符串,并将这个字符串添加到了cookie里面,键值对名称是这样的sessionid:asdasgfwq23as12 2.将is_login和username这两个键值对数据{'is_login':True,'username':'root'}首先进行了json序列化,然后进行了加密,然后将加密后的数据和sessionid对应的随机值保存到了django-session表中 3.给session保存的数据,加了有效期时间,默认是两周expire_date ''' 取值 request.session['k1'] is_login = request.session.get('is_login') ''' request.session['is_login'] 1.去cookie里面取出sessionid这个键对应的值(随机字符串) 2.通过这个随机字符串去django-session表里面获取对应的数据,session_data那一列的数据 3.对数据进行解密和反序列化,得到{'is_login':True,'username':'root'},然后通过键取出对应的值 ''' 删除值 request.session.flush() del request.session['k1'] ''' 1.删除cookie中的sessinid值 2.删除django-session表中保存的数据记录 ''' 注意:一个浏览器对应一个服务端,只有一个session #所有键、值、键值对 request.session.keys() request.session.values() request.session.items() #获取sessionid的值 session_key = request.session.session_key #设置会话session和cookie的超时时间 request.session.set_expiry(value) 1.如果value是个整数,session会在数秒后失效 2.如果value是个datatime或timedelta,session就会在这个时间后失效 3.如果value是0,用户关闭浏览器session就会失效 4.如果value是None,session会依赖全局session失效策略
6|1session全局配置
1.数据库session SESSION_ENGINE = 'django.contrib.session.backends.db' #引擎(默认) 2.缓存session SESSION_ENGINE = 'django.contrib.session.backends.cache' #引擎 SESSION_CACHE_ALIAS = 'default' #使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 3.文件Session SESSION_ENGINE = 'django.contrib.session.backends.file' #引擎 SESSION_FILE_PATH = None #缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4.缓存+数据库 SESSION_ENGINE = 'django.contrib.session.backends.cached_db' #引擎 其他公用设置项: 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过期(默认)
7|0装饰器版用session验证是否登录
from app01 import models def check_login(f): def inner(request,*args,**kwargs): #home页面和个人中心页面会先验证是否能取到存在django-session表中data对应数据 uname = request.session.get('uname',None) # print(uname,type(uname)) #liuwei <class 'str'> if uname: ret = f(request) return ret else: return redirect('/login/') return inner def login(request): if request.method == 'GET': return render(request,'login.html') else: username = request.POST.get('username') uname = models.Person.objects.filter(name=username).first().name print('>>>>>>>>>',uname,type(uname)) if uname: request.session['uname'] = uname return redirect('/home/') else: return render(request,'login.html') @check_login def home(request): return render(request,'home.html') @check_login def person_center(request): return render(request,'person.html') #注销 @check_login def logout(request): request.session.flush() return redirect('/login/')
__EOF__

本文作者:404 Not Found
本文链接:https://www.cnblogs.com/weiweivip666/p/13378961.html
关于博主:可能又在睡觉
版权声明:转载请注明出处
声援博主:如果看到我睡觉请喊我去学习
本文链接:https://www.cnblogs.com/weiweivip666/p/13378961.html
关于博主:可能又在睡觉
版权声明:转载请注明出处
声援博主:如果看到我睡觉请喊我去学习
-------------------------------------------
个性签名:代码过万,键盘敲烂!!!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
分类:
Django学习基于1.11版本
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人