zoukankan      html  css  js  c++  java
  • 12.04

    cookie 与session原理

    目的:

    保护客户端的用户状态

    原因:

    HTTP协议是无状态的

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

    cookie虽然是保存在客户端浏览器上的键值对,但它是由服务端设置,浏览器有权进制cookie的写入

    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('k1') 获取浏览器携带过来的cookie值

    设置cookie的超时时间

    obj.set_cookie('k1','v1',max_age=3)
    obj.set_cookie('k1','v1',expires=3)
    #两个参数都是设置超时时间,都是以秒做单位
    #区别是如果是给IE浏览器设置,只能用expires
    

    session

    保存在服务端上的键值对

    session的工作机制是需要依赖于cookie的

    设置session

    request.session['k1']='v1'

    注意:第一次设置需要执行数据库迁移命令,生成django需要用到的一些默认表(django_session)

    设置session发生的事

    1. django内部自动调用算法生成一个随机的字符串

    2. 在django_session添加数据(数据已被加密处理)

    3. 将产生的随机字符串返回给客户端浏览器,让浏览器保存

      sessionid:随机字符串

    获取session

    request.session.get('k1')

    获取session发生的事

    1. django内部自动去请求头里获取cookie
    2. 用sessionid所对应的的随机字符串去django_session表中一一对比
    3. 如果对比成功,会将随机字符串自动放入request.session中,没有就是一个空字典

    删除session

    request.session.delete()

    根据浏览器的不同删除对应的客户端和服务端数据

    设置失效时间

    设置会话session和cookie的超时时间

    request.session.set_expiry(value)

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

    能够作为数据库

    • 数据库软件
    • 文件
    • 内存

    token

    加密字符串

    Django中间件

    在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。

    django默认中间件有七个

    中间件的用处

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

    django支持用户自定义中间件

    中间件可以定义的五个方法

    • process_request(self,request)
    • process_view(self, request, view_func, view_args, view_kwargs)
    • process_template_response(self,request,response)
    • process_exception(self, request, exception)
    • process_response(self, request, response)

    以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。

    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,reqeust,view_name,*args,**kwargs)

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

    process_template_response

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

    def xxxx(request):
    	print('asgasda')
    	def render():
    		return HttpResponse('xxxx')
    	obj = HttpResponse('aaaa')
    	obj.render = render
    	return obj
    

    process_exception

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

  • 相关阅读:
    电子书下载:Pro jQuery
    神鬼传奇小技巧:教你如何修改自己想要的时装
    用虚拟机玩游戏的方法!! 开3D加速!
    如何让DevExpress的DateEdit控件正确显示日期的周名
    SOAP Version 1.2
    Delphi中的容器类
    <神鬼传奇>客户端终极优化精简方法
    今日阅读20090102基本数据结构
    判断一个char[]里是否包含两个连续的\r\n
    蛙蛙推荐:改进同步等待的网络服务端应用
  • 原文地址:https://www.cnblogs.com/maqiaobin/p/11985107.html
Copyright © 2011-2022 走看看