(十五)Flask覆写wsgi_app函数实现自定义中间件

这篇具有很好参考价值的文章主要介绍了(十五)Flask覆写wsgi_app函数实现自定义中间件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

中间件

一、剖析:

在前面讲session部分提到过:请求一进来,Flask会自动调用应用程序对象【Flask(__name__)】的__call__方法,这个方法负责处理请求并返回响应(其实如下图:其内部就是wsgi_app方法)。它是WSGI规范所要求的。

(十五)Flask覆写wsgi_app函数实现自定义中间件,Flask框架从入门到实战,flask,中间件,python,s覆写wsgi_app函数,自定义中间件

wsgi_app方法内部,Flask会根据路由规则和视图函数来确定如何处理请求,并生成相应的响应。最终,wsgi_app方法会将响应返回给Web服务器,供其发送给客户端(前面详细讲过,后面还会再细细剖析)。

所以,这里就有一个坑可以让我们操作,即我们可以通过覆写wsgi_app方法,实现自己的中间件逻辑,例如身份验证、日志记录等。

而且这个坑牛逼之处在于:我们可以借由它实现在最开始的开始和最后的最后做操作!!!多加理解,底下会详细讲解。

结合实战讲解—通过覆写wsgi_app函数实现一个简单的中间件:

from flask import Flask

app = Flask(__name__)


class MyMiddleware:
    def __init__(self, old_wsgi_app):
        # 服务端启动时,自动执行
        self.old_wsgi_app = old_wsgi_app

    def __call__(self, environ, start_response):
        # 每次有用户请求到来时执行
        # 在请求到达视图函数之前执行的代码
        print("Before request")

        # 调用原始的wsgi_app函数处理请求
        response = self.old_wsgi_app(environ, start_response)

        # 在响应发送给客户端之前执行的代码
        print("After request")

        return response


@app.route('/')
def home():
    return "Hello, GuHanZhe~"


# 设置自定义中间件实例为应用程序对象的wsgi_app属性
app.wsgi_app = MyMiddleware(app.wsgi_app)

if __name__ == '__main__':
    app.run()

在上述示例中,我定义了一个名为MyMiddleware的类,它接受一个Flask应用程序对象的wsgi_app方法作为参数。该类实现了__call__方法,这是一个wsgi应用程序必须具备的方法。在__call__方法中,大家可以编写自己的中间件逻辑。

__call__方法中,大家可以首先执行在请求到达视图函数之前需要执行的代码,然后调用原始的wsgi_app方法处理请求,并将响应保存在response变量中。最后,在响应发送给客户端之前,大家可以执行一些在响应阶段需要执行的代码。

通过创建自定义中间件实例,并将其设置为Flask应用程序对象的wsgi_app属性,就可以使用自定义的中间件了。

请注意,自定义中间件类必须实现__call__方法,并且接受environstart_response参数,这是遵守WSGI规范。

而且看Flask的wsgi_app函数源码,也是如此:

(十五)Flask覆写wsgi_app函数实现自定义中间件,Flask框架从入门到实战,flask,中间件,python,s覆写wsgi_app函数,自定义中间件

需要注意的是:在print("Before request")部分做操作时,只有原生的请求相关的数据environ,所以就只能对原生的environ做操作! request和session是都没有的!!!

二、应用点:

通过覆写wsgi_app函数实现的自定义中间件可以有如下几种在开发时的应用点:

  1. 可以对请求进行预处理:通过覆写wsgi_app函数,可以在请求到达视图函数之前执行一些代码逻辑,例如身份验证、参数解析、请求日志记录等。这样可以方便地对请求进行预处理,并根据需要做出相应的处理。

  2. 可以对响应进行后处理:同样地,在覆写wsgi_app函数时,还可以在响应发送给客户端之前执行一些代码逻辑,例如响应的加工、错误处理、响应日志记录等。这样可以方便地对响应进行后处理,以满足特定的需求。

  3. 可以实现自定义中间件功能:通过覆写wsgi_app函数,可以实现自定义的中间件功能。中间件是一种可重用的组件,可以用于添加额外的逻辑或修改请求/响应的行为。可以根据具体需求编写自己的中间件,并将其插入Flask应用程序对象的处理流程中。

  4. 可以实现多个中间件的串联:Flask允许使用多个中间件,并且这些中间件可以按照特定的顺序串联起来。通过覆写wsgi_app函数,可以轻松地将多个中间件组合起来,形成一个中间件链条。每个中间件都可以独立地处理请求和响应,并将处理结果传递给下一个中间件。

  5. 可以修改请求和响应:通过覆写wsgi_app函数,可以自由地修改请求和响应对象。这包括添加、删除或修改请求头部信息,修改请求体内容,修改响应状态码,添加响应头部信息等。这样可以实现更加灵活和定制化的请求/响应处理。

总而言之,覆写wsgi_app函数实现中间件提供了对请求和响应进行预处理和后处理的能力,同时也允许编写自定义的中间件功能。这样可以增强Flask应用程序的功能和灵活性,满足特定的需求。

就比如要做IP黑名单,就可以在before里直接写逻辑(environ里有请求IP信息),这样就可以在最开始的开始直接限制!

拓展:

(1)在Python中,当一个对象后面能加括号,那么这个对象可能是什么?

  1. 函数:一个函数是可调用的对象。通过在函数名后加上括号,可以执行该函数并传递相应的参数。

  2. 方法:方法是属于类的函数。通过在实例或类名后加上括号,可以调用该方法并传递相应的参数。

  3. 类:类本身也是可调用的对象。通过在类名后加上括号,可以创建类的实例。

  4. 对象:某个类的实例对象也可以是可调用的对象。通过在对象名后加上括号,可以调用该对象所属类中定义的特殊方法,例如__call__()方法。

(2)在Python中,函数和方法分别是什么?

首先,要认识到在Python中,函数(function)和方法(method)是两种不同的概念。这也是为啥我给的问题是“函数和方法分别是什么?”

  1. 函数(function)是一段封装了特定功能的可重用代码块。它接收输入参数,执行特定的操作,并返回结果。 函数可以在任何地方定义和使用,不依赖于任何类或对象。它们通常用于模块化代码、提高代码的复用性和可维护性。

    例如,下面是一个简单的函数示例:

def add(a, b):
    return a + b


result = add(2, 3)
print(result)  
  1. **方法(method)是属于某个类的函数。**它定义在类的内部,并且可以访问类的属性和其他方法。**方法通过对类的实例进行调用来执行相应的操作。**每个方法的第一个参数通常都是 self,它表示方法所属的实例对象。

    例如,下面是一个简单的类和方法示例:

class Circle:
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        return 3.14 * self.radius * self.radius

circle = Circle(5)
circle_area = circle.area()
print(circle_area)  # 输出:78.5

在上面的示例中,area()Circle 类的一个方法,它可以通过 circle.area() 的方式进行调用。

需要注意的是,对于一个类里面的函数,它究竟真是函数还是方法,取决于谁调用它!!!

举个例子:

(十五)Flask覆写wsgi_app函数实现自定义中间件,Flask框架从入门到实战,flask,中间件,python,s覆写wsgi_app函数,自定义中间件

上图中Test.index执行的话,此时index作为函数,意思是执行类里面的函数;

而下面是通过类的实例调用,所以此时是方法。

或者这样也能证明:

from types import MethodType, FunctionType

class Test(object):
    def index(self):
        pass


# print(Test.index)
print(isinstance(Test.index, FunctionType))

test = Test()
# print(test.index)
print(isinstance(test.index, MethodType))

(十五)Flask覆写wsgi_app函数实现自定义中间件,Flask框架从入门到实战,flask,中间件,python,s覆写wsgi_app函数,自定义中间件

总结:函数是独立的可调用代码块,而方法是属于类的函数,需要通过类的实例进行调用。文章来源地址https://www.toymoban.com/news/detail-754371.html

到了这里,关于(十五)Flask覆写wsgi_app函数实现自定义中间件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】

    🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 🔥🔥 本文已收录于Flask框架从入门到实战专栏 :《Flask框架从入门到实战》 🔥🔥 热门专栏推荐 :《Python全栈系列教程》、《爬虫从入门到精通系列

    2024年03月21日
    浏览(47)
  • uni-app实现自定义导航栏,兼容H5、App、微信小程序

    很多情况下,系统自带的导航栏无法满足UI设计的要求,这时候就需要我们自定义导航栏来实现需求,要考虑跨端的多种情况,这里我们封装成一个组件来使用,实现效果如下: 一、H5、App、微信小程序的区别 1.H5:导航栏高度可以设为44px,它没有状态栏,因为H5端运行在浏览

    2024年04月13日
    浏览(76)
  • Chrome 插件开发覆写xhr请求

    这几天搞chrome谷歌浏览器插件遇到个问题 我想拦截网页请求,并把数据传递到下一个子窗口。获取responsebody内容 background.js 单纯靠sendmessage实现不了通讯 最开始的时候想用chrome.webRequest.onCompleted.addListener去实现拦截,注入后发现最多只能取到header信息,回调函数里面的对象并

    2024年02月11日
    浏览(42)
  • uni-app小程序父组件数据更新,实现自定义组件刷新视图

    之前错误的思路 新思路(忽略我的参数命名,写文章的时候方便。)

    2024年02月16日
    浏览(51)
  • uniapp实现自定义导航内容高度居中(兼容APP端以及小程序端与胶囊对齐)

    ①效果图如下 1.小程序端与胶囊对齐 2.APP端内容区域居中     注意:上面使用的是colorui里面的自定义导航样式。 ②思路: 1.APP端和小程序端走不同的方法,因为小程序端要计算不同屏幕下右侧胶囊的高度。 2.其次最重要的要清晰App端和小程序端的计算逻辑。 3.然后调用api获

    2024年02月13日
    浏览(54)
  • 十五、环境变量和代理跨域及api的定义

    在根目录下新建三个环境变量配置文件 .env.development(开发环境).env.test(测试环境).evn.production(生产环境) 分别定义开发环境、线上环境和测试环境的变量 webpack vite:默认只有 VITE_ 开头的变量可以被访问 webpack: process.env.VUE_APP_TITLE vite: import.meta.env vite.config.js: loadEnv 配置

    2024年02月19日
    浏览(36)
  • Flask_自定义flask的cmd命令

    创建自定义命令 执行flask --help 可以在命令查看定义的命令 注意事项:入口文件名称必须为app,否则查看不到,也不会生效 执行命令 当入口文件名称为app是,flask run 也可以缺省其他参数,直接调用app.py文件启动服务 各位想获取源码等教程资料的朋友请 点赞 + 评论 + 收藏 ,

    2024年02月17日
    浏览(35)
  • 【C语言】自定义实现strlen函数的3种方法

    大家好,我是苏貝,本篇博客带大家了解C语言中自定义实现strlen函数的3种方法,如果大家觉得我写的不错的话,可以给我一个赞👍吗,感谢❤️ 函数原型 :size_t strlen( const char string ); //求string的长度 头文件 :#includestring.h 返回值 :返回的是第一个目的数字的首地址,类型为

    2024年02月13日
    浏览(38)
  • Python学习笔记-WSGI接口

    Web服务器网关接口 ( Python Web Server Gateway Interface ,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。 是CGI和FastCGI的升级版本。 当服 客户端发起一个请求 服务器通过

    2024年02月16日
    浏览(36)
  • Threejs进阶之十五:在Thereejs 使用自定义shader

    先看下这次代码最终要实现的效果, 效果分析: 要实现上述效果,我们需要两张图片,作为纹理贴图,使其图案产生明暗效果;然后通过定义ShaderMaterial对象通过自定义Shader实现上述效果;后面代码中会进行详细分析; 这里我们先介绍下基础知识 Shader(着色器)是一种在图

    2024年02月05日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包