Django的理解

Django的核心是中间件, 所有的请求和响应都会经过中间件

中间件是一个钩子框架, 它们可以介入请求的响应处理过程, 它用于在全局修改Django的输入和输出

Django有以下几个中间件:

  • Request中间件
  • view中间件
  • response中间件
  • exception中间件

具体执行流程如下

Django的中间件在项目的settings.py中的MIDDLEWARE_CLASSES中, 客户端每发起一个http请求, 都会从上到下依次经过所有的中间件

  • 1.None, 表示什么也不做, 继续向下处理这个请求
  • 2.返回HttpResponse对象, 不在向下去执行其它的request, view或exception中间件或对应的视图, 它将运用响应阶段的中间件并返回结果.

中间件和应用的顺序

在请求阶段中,调用视图之前,Django会按照MIDDLEWARE_CLASSES中定义的顺序自顶向下应用中间件。会用到两个钩子:

  • process_request()
  • process_view()

在响应阶段中,调用视图之后,中间件会按照相反的顺序应用,自底向上。会用到三个钩子:

  • process_exception() (仅当视图抛出异常的时候)
  • process_template_response() (仅用于模板响应)
  • process_response

关于自己写中间件

我第一次用中间件的需求是要做拦截登录, 通过使用process_view方法, 来判断用户要访问的网页是否需要登录, 是的话直接跳转到登录页, 否则就什么也不做

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

  • process_request(self, request)

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

  • 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的字典参数
  • process_response(self, request, response)

    该方法必须返回HttpResponse对象, 可以是原来的, 也可以是修改后的

    • 调用时机在django执行完view函数并生成response之后, 该中间件能修改response的内容, 常见用途比如压缩内容
    • request是request对象
    • response是从view中返回的response对象
  • process_exception(self, request, exception)
    • 该方法只有在request处理过程中出了问题并且view函数抛出了一个未捕获的异常才会被调用, 可以用来发送错误通知, 将相关信息输出到日志文件, 或者甚至尝试从错误中自动恢复
    • 参数包括request对象, 还有view函数抛出的异常对象exception
    • 必须返回None或HttpResponse对象

关于Django的理解的更多相关文章

  1. Django整体模型理解(1)

    Django大概理解 *models:  设计一个模型,即在数据库中设计一个表,一个模型就是对应一个数据库中的表:models是一个类,类名就是表名,而类的属性就是表的字段.如下例子设计了两个表: f ...

  2. [Django高级]理解django中的中间件机制和执行顺序

    原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middlewa ...

  3. django DRF理解

    django restframework(DRF) 最近的开发过程当中,发现restframework的功能很强大,所以尝试解读了一下源码,写篇博客分享给大家,有错误的地方还请各位多多指出 视图部分 ...

  4. Django框架理解和使用常见问题

    1.什么是中间件? 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出. 中间件一般做认证或批量请求处理,django中的中间 ...

  5. Django中间件理解

    一.中间件 https://www.cnblogs.com/maple-shaw/articles/9333824.html 中间件:是一个类处理django的请求和响应,本质上就是一个类,在类里面定 ...

  6. django概念理解

    STATIC_URL 和 STATICFILES_DIRS 区别  static_url指定浏览器上访问静态文件的url前缀,也就是'/static/'前缀的都会认为是静态文件,django不解析,直 ...

  7. Django 中间件理解

    中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 应用场景,对所有 ...

  8. 对django的理解

    http://www.cnblogs.com/chongdongxiaoyu/p/9403399.html https://blog.csdn.net/weixin_42134789/article/ ...

  9. Python面向对象篇之元类,附Django Model核心原理

    关于元类,我写过一篇,如果你只是了解元类,看下面这一篇就足够了. Python面向对象之类的方法和属性 本篇是深度解剖,如果你觉得元类用不到,呵呵,那是因为你不了解Django. 在Python中有一 ...

随机推荐

  1. java排序算法之冒泡排序

    冒泡排序的基本思想即将一串数字进行由小到大进行排序 例如1,9,7,2,4,3,6,10,20,5 实现思路: 第一个数分别与接下来的数字做对比 第一次  1<9不变,再1<7不变,1&l ...

  2. ionic 使用了 crosswalkwebview 所产生的bug 及 解决方案

    一.问题产生: 在ionic app 优化方案中,我在前之前的博文中提到使用 --crosswalkwebview: 使用了crosswalkwebview后,app的显示及兼容效果确实很不错,虽然a ...

  3. jQuery时间日期插件laydate,兼容bootstrap

    解压后,将laydate整个文件放至您项目的任意目录,不要移动其文件结构,它们具有完整的依赖体系. 使用只需在页面引入laydate.js即可. 如果您的网站的js采用合并或模块加载,您需要打开lay ...

  4. Linux网络编程客户\服务器设计范式

    1.前言 网络编程分为客户端和服务端,服务器通常分为迭代服务器和并发服务器.并发服务器可以根据多进程或多线程进行细分,给每个连接创建一个独立的进程或线程,或者预先分配好多个进程或线程等待连接的请求.今 ...

  5. JAVA基础——类和对象

    java类与对象学习笔记 一.成员变量和局部变量 (1)定义 1.成员变量 在类中定义,用来描述对象将要有什么.(默认的成员变量值为0) 2.局部变量 在类的方法中定义,在方法中临时保存数据. 演示示 ...

  6. Mathematica学习笔记1

    非常喜欢Mathematica的"自动草稿纸"的理念,Magic Paper, 唔哈~ Mathematica的矩阵操作和Matlab的风格十分不同. [ ] 是一个Part运算符 ...

  7. CSS样式表之常用文本属性

    断更了两周了,因为纠结之后在学java啦,但是还是要把学过的前端知识更完 以下的一些文本属性是CSS最常用的属性: [长度单位]:px(像素) [颜色单位]: 十六进制:#ffffff 分别对应红绿蓝 ...

  8. vijos1080题解

    题目: 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,20 ...

  9. 总结两种动态代理jdk代理和cglib代理

    动态代理 上篇文章讲了什么是代理模式,为什么用代理模式,从静态代理过渡到动态代理. 这里再简单总结一下 什么是代理模式,给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原 ...

  10. 使用curl,libcurl访问Https

    编译curl,libcurl 下载curl源码(git clone https://github.com/curl/curl),在目录curl\winbuild\BUILD.WINDOWS.txt文件 ...