cookie与session
forms组件源码
切入点:
form_obj . is_valid( )
python源码使用最频繁的其实就是反射
cookie与session简介
1网站都没有保存用户功能的需求
2出现了一些需要保存用户信息的网站
当用户第一次登陆成功后,将用户的用户名跟密码返回给用户浏览器,让用户浏览器保存在本地
之后访问本网站的时候浏览器自动将保存在浏览器上的用户名跟密码发送给服务端,服务端获取后
自动校验
cookie:服务端保存在用户端浏览器上的信息
它的表现形式一般都是键值对
session:数据保存在服务端的,它的表现形式一般都是键值对
1cookie就是保存在客户浏览器上的信息
2session及时保存在服务器上的信息
3session是基于cookie
其实大部分保存用户状态的操作都是需要用到cookie
cookie操作与session
虽然cookie是服务端告诉客户端浏览器需要保存的类容
但是客户端浏览器可以选择拒绝,如果禁用了,只要需要记录用户状态
的网站都登陆功能都无法使用
要想操作cookie,就要利用obj
设置cookie
obj . set_cookie( key,value )
获取cookie
request . COOKIES . get( key )
在设置cookie的时候可以添加一个超时时间
obj . set_cookie( 'username' , 'jason' , max_age = 3 expires=3 )
max_age
expires
两者都是设置超时时间的,并且都是以秒为单位
需要注意事的是,针对IE浏览器需要使用expires
主动删除cookie(注销功能)
obj . delete_cookie(键值)
session操作
session数据时保存在服务端的,给客户端返回的是一个随机字符串
1在默认情况下操作session的时候需要django默认的一张django_session表
数据库迁移命令,django会自己创建很多表,django_session就是其中一张
django默认session的过期时间是14天,但是你也可以人为修改
django_session表中的数据条数是取决于浏览器的
同一个计算机上同一个浏览器只会有一条数据生效
(当session过期的时候可能会出现多条数据对应一个浏览器,
但是该现象不会持续很久,内部会自动识别过期的数据并清除,
你也可以通过代码清除)
主要是为了节约服务端数据库资源
session是保存在服务端的,但是session保存位置可以有很多选择
1mysql
2文件
3redis
4memcache
设置session
request.session( 'key' ) = value
设置内部发生了那些事
1django内部会自动帮你生成一个随机字符串
2django内部自动将随机字符串和对应的数据存储到django_session表中
2.1先在内存中产生操作数据的缓存
2.2在响应结束django中间件的时候才真正的操作数据库
3将产生的随机字符串返回给客户端浏览器保存
获取session
request.session.get( 'key' )
内部发生了那些事
1自动从浏览器请求中获取sessionID对应的随机字符串
2拿着该随机字符串去diango_session表中查找对应的数据
3如果比对上了,则将对应的数据读取出来并以字典的形式封装到request.session中
如果比对不上,则request.session.get()返回的是none
设置过期时间
request.session.set_expiry( )
括号内可以放四种类型的参数
1整数 多少秒
2日期对象 指定日期
30 一旦当前浏览器窗口关闭就立刻失效
4不写 取决于django内部全局默认的失效时间
清除session
request.session.delete( ) 只删服务端
request.session.flush( ) 浏览器跟服务端都清空
CBV添加装饰器
from django.utils.decorators import method_decorator
在CBV中django不建议你直接给类的方法加装饰器
无论该装饰器能否正常工作,都不建议直接加
方式一:@method_decorator(方法) 方法里面
方式二:@method_decorator(方法,name=) 类上面
方式三:给dispath 它会直接作用于当前类的所有方法
有时候如果多个试图函数度需要使用到一些数据的话,你可以考虑将该数据存储到django_session
表中,方便后续使用