• 了解Django Middleware的几个关键方法

    Middleware中间件起到关键作用
    服务器君一共花费 16.353 ms 进行了 2 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    Django 处理一个 Request 的过程是首先通过中间件,然后再通过默认的 URL 方式进行的。我们可以在 Middleware 这个地方把所有Request 拦截住,用我们自己的方式完成处理以后直接返回 Response。因此了解中间件的构成是非常必要的。

    Initializer: __init__(self)

    出于性能的考虑,每个已启用的中间件在每个服务器进程中只初始化一次。也就是说 __init__() 仅在服务进程启动的时候调用,而在针对单个 request 处理时并不执行。

    对一个 middleware 而言,定义 __init__() 方法的通常原因是检查自身的必要性。如果 __init__() 抛出异常 django.core.exceptions.MiddlewareNotUsed ,则 Django 将从 middleware 栈中移出该 middleware。

    在中间件中定义 __init__() 方法时,除了标准的 self 参数之外,不应定义任何其它参数。

    Request预处理函数: process_request(self, request)

    这个方法的调用时机在 Django 接收到 request 之后,但仍未解析URL以确定应当运行的 view 之前。Django 向它传入相应的 HttpRequest 对象,以便在方法中修改。

    process_request() 应当返回 None 或 HttpResponse 对象。

    如果返回 None ,Django 将继续处理这个 request,执行后续的中间件, 然后调用相应的 view。

    如果返回 HttpResponse 对象,Django 将不再执行任何其它的中间件(无视其种类)以及相应的view。 Django将立即返回该 HttpResponse。

    View预处理函数: process_view(self, request, callback, callback_args, callback_kwargs)

    这个方法的调用时机在 Django 执行完 request 预处理函数并确定待执行的 view 之后,但在 view 函数实际执行之前。

    • request:HttpRequest 对象。
    • callback:Django将调用的处理request的python函数. 这是实际的函数对象本身, 而不是字符串表述的函数名。
    • args:将传入view的位置参数列表,但不包括 request 参数(它通常是传入view的第一个参数)。
    • kwargs:将传入view的关键字参数字典。

    如同 process_request() , process_view() 应当返回 None 或 HttpResponse 对象。如果返回 None , Django将继续处理这个 request ,执行后续的中间件, 然后调用相应的view。

    如果返回 HttpResponse 对象,Django 将不再执行 任何 其它的中间件(不论种类)以及相应的view,Django将立即返回。

    Response后处理函数: process_response(self, request, response)

    这个方法的调用时机在 Django 执行 view 函数并生成 response 之后。

    该处理器能修改 response 的内容;一个常见的用途是内容压缩,如 gzip 所请求的 HTML 页面。

    这个方法的参数相当直观: request 是 request 对象,而 response 则是从 view 中返回的 response 对象。

    process_response() 必须返回 HttpResponse 对象. 这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。

    Exception后处理函数: process_exception(self, request, exception)

    这个方法只有在 request 处理过程中出了问题并且 view 函数抛出了一个未捕获的异常时才会被调用。这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件,或者甚至尝试从错误中自动恢复。

    这个函数的参数除了一贯的 request 对象之外,还包括view函数抛出的实际的异常对象 exception 。

    process_exception() 应当返回 None 或 HttpResponse 对象。

    如果返回 None , Django将用框架内置的异常处理机制继续处理相应request。

    如果返回 HttpResponse 对象,Django 将使用该response对象,而短路框架内置的异常处理机制。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [软件工程与项目管理] 浏览器初步介绍 8 个条目
  2. [JavaScript程序设计] jQuery与表单操作 2 个条目
  3. [Python程序设计] Django模板系统 11 个条目
  4. [计算机算法] 从双端队列引出的卡特兰数 3 个条目
  5. [数据库技术] 数据库范式篇 5 个条目
  6. [PHP程序设计] 命令式编程范式 6 个条目
  7. [搜索引擎优化] 与百度权重有关的信息 2 个条目
  8. [软件工程与项目管理] 浏览器的HTML解析器 8 个条目
  9. [移动开发] 从代码角度去认识 Handler 4 个条目
  10. [移动开发] Android View注入框架Butter Knife 3 个条目
  11. [计算机算法] 两数交换的各种算法细节 2 个条目
  12. [Python程序设计] Django数据库模型 6 个条目
窗口 -- [协会]