django框架

2,036 阅读5分钟

django中间件三个了解方法

  • process_view

      process_view 方法格式如下:process_view(request, view_func, view_args, view_kwargs)
    
    
      process_view 方法有四个参数:
    
      request 是 HttpRequest 对象。
      view_func 是 Django 即将使用的视图函数。
      view_args 是将传递给视图的位置参数的列表。
      view_kwargs 是将传递给视图的关键字参数的字典。
    
      view_args 和 view_kwargs 都不包含第一个视图参数(request)。
    
      process_view 方法是在视图函数之前,process_request 方法之后执行的。
    
      返回值可以是 Noneview_func(request) 或 HttpResponse 对象。
    
      返回值是 None 的话,按正常流程继续走,交给下一个中间件处理。
      返回值是 HttpResponse 对象,Django 将不执行后续视图函数之前执行的方法以及视图函数,直接以该中间件为起点,倒序执行中间件,且执行的是视图函数之后执行的方法。
      c.返回值是 view_func(request),Django 将不执行后续视图函数之前执行的方法,提前执行视图函数,然后再倒序执行视图函数之后执行的方法。
      当最后一个中间件的 process_request 到达路由关系映射之后,返回到第一个中间件 process_view,然后依次往下,到达视图函数。
      
    

image.png

  • process_exception

      process_exception 方法如下:process_exception(request, exception)
    
      参数说明:
    
      request 是 HttpRequest 对象。
      exception 是视图函数异常产生的 Exception 对象。
    
      process_exception 方法只有在视图函数中出现异常了才执行,按照 settings 的注册倒序执行。
    
      在视图函数之后,在 process_response 方法之前执行。
    
      process_exception 方法的返回值可以是一个 None 也可以是一个 HttpResponse 对象。
    
      返回值是 None,页面会报 500 状态码错误,视图函数不会执行。
    
      process_exception 方法倒序执行,然后再倒序执行 process_response 方法。
    
      返回值是 HttpResponse 对象,页面不会报错,返回状态码为 200。
    
      视图函数不执行,该中间件后续的 process_exception 方法也不执行,直接从最后一个中间件的 process_response 方法倒序开始执行。
    
      若是 process_view 方法返回视图函数,提前执行了视图函数,且视图函数报错,则无论 process_exception 方法的返回值是什么,页面都会报错, 且视图函数和 process_exception 方法都不执行。
      
    
  • process_template_response

      process_template_response(self, request, response) 有两个参数,response 是 TemplateResponse 对象(由视图函数或者中间件产生)
    
      process_template_response 函数是在视图函数执行完后立即执行的
    
      执行 process_template_response 函数有一个前提条件,那就是视图函数返回的对象要有一个 render() 方法(或者表明该对象是一个 TemplateResponse 对象或等价方法)
      
    

基于django中间件的功能设计

将各个功能制作成配置文件的字符串形式
        如果想拥有该功能就编写对应的字符串
        如果不想有该功能则注释掉对应的字符串

补充知识:如果利用字符串导入模块
import importlib
s1 = 'bbb.b'  # aaa.bbb.ccc.b
res = importlib.import_module(s1)  # from aaa.bbb.ccc import b
print(res)  # <module 'bbb.b' from 'D:\\pythonProject03\\djangomiddle\\bbb\\b.py'>
注意字符串的结尾最小单位只能是py文件 不能是py文件里面的变量名

需求分析:模拟编写一个消息通知功能(微信、qq、邮箱)

方式1:基于函数封装的版本
        没有眼前一亮的感觉 很一般
方式2:基于django中间件的功能设计
        眼前一亮 回味无穷
        
        
        

cookie与session

  • Cookie

      是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。
    
      识别返回用户包括三个步骤:
    
      服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。
      浏览器将这些信息存储在本地计算机上,以备将来使用。
      当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户。
    
      HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。
    
      但是仍然有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话。
    

image.png

  • Session(保存在服务端的键值对)

      服务器在运行时可以为每一个用户的浏览器创建一个其独享的 session 对象,由于 session 为用户浏览器独享,所以用户在访问服务器的 web 资源时,可以把各自的数据放在各自的 session 中,当用户再去访问该服务器中的其它 web 资源时,其它 web 资源再从用户各自的 session 中取出数据为用户服务。
      
    
  • 工作原理

      a. 浏览器第一次请求获取登录页面 login。
      b. 浏览器输入账号密码第二次请求,若输入正确,服务器响应浏览器一个 index 页面和一个键为 sessionid,值为随机字符串的 cookie,即 set_cookie ("sessionid",随机字符串)。
    
      c. 服务器内部在 django.session 表中记录一条数据。
    
      django.session 表中有三个字段。
    
      -   session_key:存的是随机字符串,即响应给浏览器的 cookie 的 sessionid 键对应的值。
      -   session_data:存的是用户的信息,即多个 request.session["key"]=value,且是密文。
      -   expire_date:存的是该条记录的过期时间(默认14天)
    
      d. 浏览器第三次请求其他资源时,携带 cookie :{sessionid:随机字符串},服务器从 django.session 表中根据该随机字符串取出该用户的数据,供其使用(即保存状态)。
    
      注意:  django.session 表中保存的是浏览器的信息,而不是每一个用户的信息。 因此, 同一浏览器多个用户请求只保存一条记录(后面覆盖前面),多个浏览器请求才保存多条记录。
    
      cookie 弥补了 http 无状态的不足,让服务器知道来的人是"谁",但是 cookie 以文本的形式保存在浏览器端,安全性较差,且最大只支持 4096 字节,所以只通过 cookie 识别不同的用户,然后,在对应的 session 里保存私密的信息以及超过 4096 字节的文本。
      
    

image.png