关于Django的理解
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的理解的更多相关文章
- Django整体模型理解(1)
Django大概理解 *models: 设计一个模型,即在数据库中设计一个表,一个模型就是对应一个数据库中的表:models是一个类,类名就是表名,而类的属性就是表的字段.如下例子设计了两个表: f ...
- [Django高级]理解django中的中间件机制和执行顺序
原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middlewa ...
- django DRF理解
django restframework(DRF) 最近的开发过程当中,发现restframework的功能很强大,所以尝试解读了一下源码,写篇博客分享给大家,有错误的地方还请各位多多指出 视图部分 ...
- Django框架理解和使用常见问题
1.什么是中间件? 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出. 中间件一般做认证或批量请求处理,django中的中间 ...
- Django中间件理解
一.中间件 https://www.cnblogs.com/maple-shaw/articles/9333824.html 中间件:是一个类处理django的请求和响应,本质上就是一个类,在类里面定 ...
- django概念理解
STATIC_URL 和 STATICFILES_DIRS 区别 static_url指定浏览器上访问静态文件的url前缀,也就是'/static/'前缀的都会认为是静态文件,django不解析,直 ...
- Django 中间件理解
中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 应用场景,对所有 ...
- 对django的理解
http://www.cnblogs.com/chongdongxiaoyu/p/9403399.html https://blog.csdn.net/weixin_42134789/article/ ...
- Python面向对象篇之元类,附Django Model核心原理
关于元类,我写过一篇,如果你只是了解元类,看下面这一篇就足够了. Python面向对象之类的方法和属性 本篇是深度解剖,如果你觉得元类用不到,呵呵,那是因为你不了解Django. 在Python中有一 ...
随机推荐
- 【JavaScript学习】-JS内置对象1-对象概述
对象(object): JavaScript 中的所有事物都是对象,如:字符串.数值.数组.函数等,每个对象带有属性和 方法.JavaScript 提供多个内建对象,比如 String.Date.Ar ...
- 用jquery循环获得所有input标签里的value值
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- java excel导出
下面是jsp代码: <li class="btns"><input id="btnExport" class="btn btn-pr ...
- PYC#1欢乐赛第三题题解
这里是比赛地址:http://tieba.baidu.com/p/2859693237,果然参赛神牛汇集. 第三题题目大意如下: 已知n条二次函数曲线Si(x)=aix^2+bix+ci(ai> ...
- EasyNetQ之多态发布和订阅
你能够订阅一个接口,然后发布基于这个接口的实现. 让我们看下一个示例.我有一个接口IAnimal和两个实现Cat和Dog: public interface IAnimal { string Name ...
- Chrome浏览器扩展开发系列之十三:消息传递Message
由于content scripts运行在Web页面的上下文中,属于Web页面的组成部分,而不是Google Chrome扩展程序.但是content scripts又往往需要与Google Chrom ...
- POJ 2502 Subway-经过预处理的最短路
Description You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. Instead of ...
- springmvc(三) 参数绑定、
前面两章就介绍了什么是springmvc,springmvc的框架原理,并且会简单的使用springmvc以及ssm的整合,从这一章节来看,就开始讲解springmvc的各种功能实现,慢慢消化 --W ...
- CJOJ 2485 UVa 11991 生日礼物 / UVa 11991 Easy Problem from Rujia Liu?
CJOJ 2485 UVa 11991 生日礼物 / UVa 11991 Easy Problem from Rujia Liu? Description (原题来自刘汝佳<训练指南>Pa ...
- 基于requirejs和angular搭建spa应用
接上篇,angular 实战部分,angular比较适合spa项目,这里不借助任何seed和构建工具,直接从零搭建,基本的angular项目结构大致包含如下几个部分: 1)app.js 入口 2)in ...