django学习第十一天---django操作cookie和session
Cookie
cookie解析
会话
http协议是无状态的,无连接的
导致每次客户端访问服务端需要登录成功之后才能访问的页面,都需要用户再重新登录一遍,用户体验极差。
客户端想了个办法,cookie,小甜点
浏览器第一次请求携带的cookie为{},服务器设置cookie并返回给浏览器,浏览器第二次请求携带服务器返回的cookie
客户端保存cookie是保存在本地,本地有cookie文件。请求的时候会查看本地是否有存储的这个服务端的cookie,如果有,每次请求都自动带上这些cookie
查看响应回来的cookie
浏览器打开F12在Network查看响应回来的cookie
第一次请求服务端,服务端设置了一组cookie键值对,如name=xiaoxin,那么响应回来的数据会带着这组键值对给客户端,客户端将这一组数据保存到了客户端本地,那么下次再访问这个服务端,会自动带着这一对cookie数据
django操作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')
设置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获取(不是绝对,底层抓包可以获取到也可以被覆盖)
cookie特点
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发送给服务器。
Session
- 简介
针对以上特点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}去请求服务器。
django的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失效策略
session全局配置
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过期(默认)
装饰器版用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/')
django学习第十一天---django操作cookie和session的更多相关文章
- Django学习笔记之URL与视图cookie和session
cookie和session cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了 ...
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
- JavaScript能否操作cookie和session?
JavaScript能否操作cookie和session? 解答:JavaScript可以操作cookie,但是不能操作session
- django中操作cookie与session
cookie 什么是Cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息. Cookie的 ...
- django操作cookie和session
一.cookie:保存在客户端浏览器上的键值对 Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会 ...
- Django 操作Cookie与Session
目录 Cookie Session Django中操作Cookie 基本操作 基于cookie的登录装饰器 Django中操作Session 基本操作 Session流程解析 基于session的登录 ...
- Django学习之十一:真正理解Django的路由分发和反解url原理
目录 URL Dispatcher 简介 模式概念 对比URLPattern 与 URLResolver (多态的体现) 构建子路由几种方式 反解url算法逻辑 URL Dispatcher 简介 d ...
- django基础之Ajax、分页、cookie与session
目录: Ajax之json Ajax简介 jquery实现的ajax js实现的ajax django分页器 COOKIE与SESSION 一.Ajax之json 1.什么是json? 定义: JSO ...
- [python][django学习篇][3]创建django web的数据库模型
推荐学习博客:http://pythonzh.cn/post/8/ 博客或者web界面向用户展示内容,它需要从某个地方获取博客内容或者web界面内容,才能够展示出来.通常来说:某个地方指的就是数据库 ...
- Django学习笔记之使用 Django项目开发框架
Django 项目是一个定制框架,它源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来.Django 框架的核心组件有: 用于创建模型的对象关系映射 为最终用户设计的完美管理界面 ...
随机推荐
- [转帖]调优"四剑客"的实战演练,福尔摩斯•K带你轻松优化性能
前言 天下武功,唯快不破.在侦探的世界中,破案效率永远是衡量一名侦探能力的不二法门.作为推理界冉冉升起的新星,大侦探福尔摩斯·K凭借着冷静的头脑.严谨的思维,为我们展现了一场场华丽而热血的推理盛宴. ...
- SQLServer Core 序列号使用CPU限制的处理
SQLServer Core 序列号使用CPU限制的处理 背景 有客户是SQLSERVER的数据库. 说要进行一下压测. 这边趁着最后进行一下环境的基础搭建工作. 然后在全闪的环境上面搭建了一个Win ...
- [转帖]A17再次证明苹果才是王者,组装芯片的安卓手机给它提鞋都不配
http://news.sohu.com/a/653472711_121124371 在挤了两代牙膏之后,苹果终于拿出了性能大幅提升的A17处理器,外媒传出A17处理器的性能提升幅度至少超过四成,相比 ...
- 兼容微信支付宝抖音小程序的工具推荐!还能将小程序搬到自己的app里面
事情的起因是这样的. 之前在微信.支付宝和抖音开放平台都上架了自己的小程序,虽然几个平台有自己的开发标准,但是都是基于 JavaScript 这种已经被广泛使用的编程语言进行开发的,对于开发者而言学习 ...
- SHA加密在实际应用中的优势与局限
SHA加密算法简介 SHA(Secure Hash Algorithm)加密算法是一种单向加密算法,常用于加密数据的完整性校验和加密签名.它是由美国国家安全局(NSA)设计并广泛应用于各种安全场景.S ...
- vue如何在render函数中使用判断(2)
h函数的三个参数 第一个参数是必须的. 类型:{String | Object | Function} 一个 HTML 标签名.一个组件.一个异步组件.或一个函数式组件. 是要渲染的html标签. 第 ...
- 【JS 逆向百例】X球投资者社区 cookie 参数 acw_sc__v2 加密分析
关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...
- 【JS 逆向百例】医保局 SM2+SM4 国产加密算法实战
关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...
- 8.5 C++ 继承与多态
C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...
- 一篇带你掌握cmake入门|了解cmake|掌握cmake基本操作
一篇带你掌握cmake入门 内容出处: 作者: 苏丙榅 链接: https://subingwen.cn/cmake/CMake-primer/ 来源: 爱编程的大丙 著作权归作者所有.商业转载请联系 ...