自我总结51

cookie与session原理

1.目的是为了保存客户端的用户状态

2.原因: HTTP协议是无状态的

cookie

保存在客户端浏览器上的键值对

session

保存在服务端上面的键值对

工作机制依赖于cookie

token

加密字符串

加密算法

username + 随机字符串

django操作cookie

# 利用obj对象你才可以操作cookie
obj = HttpResponse()
return obj
obj = render()
return obj
obj = redirect()
return obj

如何设置cookie

obj.set_cookie(k1,v1) # 告诉浏览器设置

如何获取cookie

request.COOKIES.get() # 获取浏览器携带过来的cookie值

如何设置cookie的超时时间

# 两个参数都是设置超时时间  并且都是以秒为单位
obj.set_cookie('k1','v1',max_age=3)
obj.set_cookie('k1','v1',expires=3)# IE浏览器专属
# 获取url路径两种方法
request.path_info  # 只获取url
request.get_full_path()	 # url+get参数

session

django默认的session失效时间是14天 2周

设置session

request.session['k1'] = 'v1'
# 第一次设置会报错  需要数据库迁移命令
# 生成django需要用到的一些默认表(django_session)

request.session['k1'] = 'v1'
'''
产生的过程
1.django内部自动帮你调用算法生成一个随机的字符串

2.在django session添加数据 (数据也是加密处理)
................................................
	随机字符串  |  加密之后的数据   | 失效时间
................................................
	xxxxxxxx  |		xxxxxxxx	| 
................................................

3.讲产生的随机字符串返回给客户端浏览器  让浏览器保存
	sessionid:随机字符串
	
'''

# 设置失效时间
request.session.set_expiry(value)

* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略

获取session

request.session.get('k1')

'''
1.django内部会自动请求头里面获取cookie
2.拿着sessionid所对应的随机字符串去django_session表中一一对比
3.如果比对上了,会将随机字符串对应的数据获取出来,自动放入request.session中供程序员调用;如果没有就是空字典

'''

删除session

request.session.delect() # 删除当前会话的所有Session数据

request.session.flush() #  删除当前的会话数据并删除会话的Cookie
# 这用于确保前面的会话数据不可以再次被用户的浏览器访问。例如,django.contrib.auth.logout() 函数中就会调用它。

django session在创建的时候 是针对浏览器,几个浏览器就有几行数据,同一个浏览器的不同用户记录都在一行数据里

浏览器数据超过时间失效了之后,会重新另起一行数据,失效的数据行数一定时间后会自动清除

django中间件

默认有七个 是所有框架里面做的最完善的

只要你想要做一些网站的全局性功能 考虑django的中间件

1.全局的用户登录校验
2.全局的用户访问频率校验
3.全局的用户权限校验

关系

对象 字符串 >>> 反射

全局 >>> 中间件

支持自定义中间件 暴露给用户五个可以自定义的方法

需要掌握

process_request

1.请求来的时候会按照settings配置文件中从上往下的顺序,依次执行每一个中间件内部定义的process_request方法
如果中间件内部没有该方法  直接跳过执行下一个中间件
2.该方法一单返回了HttpResponse对象,那么请求会立刻停止往后走,园路立即返回



process_response

1.响应走的时候会按照settings配置文件中从下往上的顺序,一次执行每一个中间件内部定义的process_response方法
2.该方法必须有两个形参  并且必须返回response形参,不返回直接报错
3.该方法返回什么(HttpResponsed对象) 前端就能获得什么


注意:当process_request方法直接返回HttpResponse对象之后  会直接从当前中间件里面的process_respone往回走
没有执行的中间件都不会执行

需要了解

process_view(self,request,view_name,*args,**kwargs)

1.路由匹配成功之后执行视图函数之前触发
2.如果该方法返回了HttpResponse对象,那么会从下往上一次经过每一个中间件里面的process_response方法


process_template_response
当你返回的对象中含有render属性指向的是一个render方法的时候才会触发,从下往上的顺序

process_exception
当视图函数中出现错误 会自动触发  顺序是从下往上

注意:如果形参中含有response 那么必须要返回
posted @ 2019-12-06 14:44  jzm1201  阅读(83)  评论(0编辑  收藏  举报