美文网首页
三阶段day06-装饰器与中间件、cookie与session

三阶段day06-装饰器与中间件、cookie与session

作者: ATM_shark | 来源:发表于2018-12-07 19:53 被阅读0次

    装饰器

    装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,
    装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
    装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
    概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能。

    结构
    @bbb   #定义aaa函数装饰器为bbb
    def aaa(x):
        pass
    
    
    #声明bbb函数
    def bbb(x):
    
        #1、外层函数bbb内嵌内层函数ccc
        def ccc(y):
    
            # 3、内层函数ccc调用外层函数的参数x
            return x(y)
    
        #2、外层函数bbb返回内层函数ccc
        return ccc
    

    中间件

    1. 中间件Middleware描述
      中间件:
      是一个轻量级的,底层的插件,可以介入Django的请求和响应的过程(面向切面编程)
      中间件的本质就是一个python类

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

    思考:

    什么是中间件,在settings.py中有很多的中间件,主要是用来做什么功能的呢,
    他们处理请求的url的过程在那些阶段呢,一般用来做那些数据的处理呢

    1. 中间件类函数描述
      在Django项目中,在settings.py中可以查看到已经定义好的中间件,并加入我们自定义的两个中间件。
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    
        'utils.middleware.TestMiddlware1',  # 加载中间件TestMiddlware1
        'utils.middleware.TestMiddlware2',  # 加载中间件TestMiddlware2
    ]
    

    每个中间件是一个独立的类, 有几下几个方法

    1. process_request(self, request)
      执行时机在django接收到request之后, 但仍未解析出url以确定运行哪个视图函数view之前

    2. process_view(self, request, view_func, view_args, view_kwargs)
      执行时机在django执行完request预处理函数并确定待执行的view之后, 但在视图函数view之前
      request: HttpRequest对象
      view_fun: 是django将要调用的视图函数, 是真实的函数对象本身
      view_args: 将传入view的位置参数列表, 不包括request参数
      view_kwargs: 将传入view的字典参数

    3. process_response(self, request, response)
      该方法必须返回HttpResponse对象, 可以是原来的, 也可以是修改后的
      调用时机在django执行完view函数并生成response之后, 该中间件能修改response的内容, 常见用途比如压缩内容
      request是request对象
      response是从view中返回的response对象

    4. process_exception(self, request, exception)
      默认不主动调用,该方法只有在request处理过程中出了问题并且view函数抛出了一个未捕获的异常才会被调用,
      可以用来发送错误通知, 将相关信息输出到日志文件, 或者甚至尝试从错误中自动恢复
      参数包括request对象, 还有view函数抛出的异常对象exception
      必须返回None或HttpResponse对象

    5. process_template_response(self, request, response)
      默认不主动调用,在视图执行render()返回后进行调用,必须返回None或HttpResponse对象
      以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,
      如果是HttpResponse对象,则直接将该对象返回给用户。

    cookie与session

    1. cookie

    HTTP 协议是无状态的。因此,若不借助其他手段,远程的服务器就无法知道以前和客户端做了哪些通信。Cookie 就是「其他手段」之一。 Cookie 一个典型的应用场景,就是用于记录用户在网站上的登录状态。

    用户登录成功后,服务器下发一个(通常是加密了的)Cookie 文件。 客户端(通常是网页浏览器)将收到的 Cookie 文件保存起来。 下次客户端与服务器连接时,将 Cookie 文件发送给服务器,由服务器校验其含义,恢复登录状态(从而避免再次登录)。

    1.1 描述
    浏览器端的回话技术
    cookie本身由浏览器生成,通过Response将cookie写在浏览器上,下一次访问,浏览器会根据不同的规则携带cookie过来
    1.2 cookie方法

    设置:response.set_cookie(key, value, max_age=None, exprise=None)
    
    获取:request.GET.get(key)
    
    删除:request.delete_cookie(key)
    注意:cookie不能跨浏览器
    

    参数定义:

    max_age和exprise时间:

    max_age : 整数,指定cookie过期时间,以秒为单位

    exprise: 整数,指定过期时间,还支持是一个datetime或者timedelta,可以指定一个具体日期时间
    设置10天后过期:

    exprise=datetime.datetime.now() + timedelta(days=10) 10天后过期
    永不过期:

    exprise设置为None表示为永不过期

    2. session

    2.1 描述
    服务端会话技术,依赖于cookie
    2.2 开启session设置
    1)django中启用SESSION

    在settings中修改如下地方

    INSTALLED_APPS:
        ‘django.contrib.sessions’
    
    MIDDLEWARE:
        ‘django.contrib.sessions.middleware.SessionMiddleware’
    

    每个HttpResponse对象都有一个session属性,也是一个类字典对象

    2.3 常用操作

    request.session[‘user’] = username 设置数据
    
    request.session.get(key, default=None) 根据键获取会话的值
    
    request.session.flush() 删除当前的会话数据并删除会话的cookie,django.contrib.auth.logout() 函数中就会调用它。
    
    request.session.session_key  获取sessionid值
    
    request.session.delete(request.session.session_key) 删除当前用户的所有Session数据
    
    del request.session['key'] 删除session中的key值
    
    request.session.set_expiry(value)
    #如果value是个整数,session会在些秒数后失效
    #如果value是个datatime或timedelta,session就会在这个时间后失效。 
    时#如果value是0,用户关闭浏览器session就会失效。
    
    
    数据存储到数据库中会进行编码使用的是base64
    

    相关文章

      网友评论

          本文标题:三阶段day06-装饰器与中间件、cookie与session

          本文链接:https://www.haomeiwen.com/subject/otuxhqtx.html