资讯专栏INFORMATION COLUMN

Django中Middleware中的函数

tuniutech / 499人阅读

摘要:一般情优下我们以在这里做一些校验比如户登录或者中是否有认证头之类的验证这个方法可以有两种返回值或者,如果返回,那么接下米的处理方法只会执行,其他方法将不会被执行。它的返回值跟一样,是或者,其逻辑也一样。

一个middleware的例子

import time

from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin


class TimeItMiddleware(MiddlewareMixin):
    def process_request(self, request):
        return

    def process_view(self, request, func, *args, **kwargs):
        if request.path != reverse("index"):
            return None

        start = time.time()
        response = func(request)
        costed = time.time() - start
        print("process view: {:.2f}s".format(costed))
        return response

    def process_excepttion(self, request, exception):
        pass

    def process_template_response(self, request, response):
        return response

    def process_response(self, request, response):
        return response

middleware中的函数有:

process_request

process_view

process_tmplate_response

process_response

process_exception

下面分别进行介绍:

process_request:

这是请求来到 middleware 中时讲入的第一个方法。一般情优下,我们以在这里做一些校验,比如
户登录或者 HTTP 中是否有认证头之类的验证.这个方法可以有两种返回值 HttpResnonse 或者None,如果返回 HttpResponse,那么接下米的处理方法只会执行 process_response,其他方法将不会被执行。这里需要注意的是,如果你的 middleware 是 settings 配置的 MIDDLEWARE 的第一个,那么剩下的 middleware 也不会被执行;如果返回 None,那么 Diango会继续执行其他方法。

process_view:

这个方法是在 process_request 方法之后执行的,参数如上面代码所示,其中 func 就是我们将要执行的 view 方法。因此,如果要统计一个view的执行时间,可以在这里做。它的返回值跟 process_request 一样,是HttpResponse 或者 None,其逻辑也一样。如果返回 None,那么 Django 会帮你执行 view 函数,从而得到最终的 response。

Process_template_response:

执行完上面的方法,并且 Django 帮我们执行完 view,拿到最终的 response 后,如果使用了模板的 response (这是指通过 return render(request,"index.html",context={})方式返回的 response),就会来到这个方法中。 在这个方法中,我们可以对 response 做一下操作,比如 Content-Type 设置,或者其他 header 的修改/增加。

process_response:

当所有流程都处理完毕后,就来到了这个方法。这个方法的逻辑跟 process_template_response是完全一样的,只是后者是针对带有模板的response的处理。

process_exception:

上面的处理方法是按顺序介绍的,而这个方法不太一样。只有在发生异常时,才会进入这个方法。哪个阶段发生的异常呢?
可以简单理解为在将要调用的 View 中出现异常(就是在process_view 的 func 函数中)或者返回的模板 response 在渲染时发生的异常。但是需要注意的是,如果你在process_view 中手动调用了 func,就像我们上面做的那样,就不会触发 process_exception 了。这个方法接收到异常之
后,可以选择处理异常,然后返回一个含有异常信息的 HttpResponse,或者直接返回 None 不处理,这种情况下 Django会使用自己的异常模板。

以上节选自《Django企业开发实战》 胡阳著。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45163.html

相关文章

  • Django运行方式及处理流程总结(xianglong.me)

    摘要:所以,我按照自己的逻辑总结了一下项目的运行方式和对的基本处理流程。二请求处理流程和其他框架一样,的处理流程基本类似接受,返回内容。在中,中间件组件用字符串表示指向中间件类名的完整路径。 之前在网上看过一些介绍Django处理请求的流程和Django源码结构的文章,觉得了解一下这些内容对开发Django项目还是很有帮助的。所以,我按照自己的逻辑总结了一下Django项目的运行方式和对Re...

    MudOnTire 评论0 收藏0
  • Django自定义间件模块--自动搜索stackoveflow答案

    摘要:中间件的分类请求期间返回期间如果需要自定义,在中添加对应路径的文件即可自定义方法需求场景在平时开发调试中,会遇到这样那样的报错,我们自定义一个简单的中间件,的自定义步骤很简单,实现方法即可根据的和信息,调用的接口,当报错时自动搜索相关的答案 Django中间件MIDDLEWARE的分类: 请求期间: process_request(request) process_view(reque...

    wizChen 评论0 收藏0
  • 去掉django rest framework强制的csrf检查

    摘要:近期的项目,前端的是在上跑的,然后向我们后端的开发服务器进行请求。那怎么去掉这个功能呢,我们现在就是要进行跨域请求。这里里面有就直接进入了,没有下面的检查了。所以我们只要自己给添加一个这样的属性就好了。最直接的方法还是去写一个啊,哈哈。 近期的项目,前端的js是在localhost上跑的,然后向我们后端的开发服务器进行请求。但是突然前端说所有的post请求都报csrf校验错误了,甚是奇...

    amc 评论0 收藏0
  • 处理Djangocors跨域问题

      同源策略:同源策略/SOP(Sameoriginpolicy)是一类承诺,由Netscape公司1995年引进电脑浏览器,这是电脑浏览器最关键也最基本安全配置,如今全部适用JavaScript浏览器都是会使用这种对策。假如缺乏了同源策略,电脑浏览器很容易受XSS、CSFR等进攻。  同宗就是指"协议书+网站域名+服务器端口"三个同样,就算两种不同的域名跳转相同ip详细地址,...

    89542767 评论0 收藏0
  • (转)django 设置 数据库缓存

    摘要:官方缓存系统介绍配置方式及内部实现机制中大体分为三种,即针对全站的缓存配置针对视图的缓存配置针对数据的缓存配置。本站采用数据库全站缓存。每个页面应该被缓存的秒数重启就可以体验缓存了。 最近博客增加了许多新功能,访问速度有所下降,在国内某搜索引擎上查找的时候看到了这篇文字,简单明了,所以转发过来,虽不是原创但是希望能够帮助更多的朋友。 Django 官方缓存系统介绍: https://d...

    Flands 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<