iis做网站文件下载,软文营销怎么写,现在做百度快速收录的方法,长沙优化网站方法中间件
一、剖析#xff1a;
在前面讲session部分提到过#xff1a;请求一进来#xff0c;Flask会自动调用应用程序对象【Flask(__name__)】的__call__方法#xff0c;这个方法负责处理请求并返回响应#xff08;其实如下图#xff1a;其内部就是wsgi_app方法#xff…中间件
一、剖析
在前面讲session部分提到过请求一进来Flask会自动调用应用程序对象【Flask(__name__)】的__call__方法这个方法负责处理请求并返回响应其实如下图其内部就是wsgi_app方法。它是WSGI规范所要求的。 在wsgi_app方法内部Flask会根据路由规则和视图函数来确定如何处理请求并生成相应的响应。最终wsgi_app方法会将响应返回给Web服务器供其发送给客户端前面详细讲过后面还会再细细剖析。
所以这里就有一个坑可以让我们操作即我们可以通过覆写wsgi_app方法实现自己的中间件逻辑例如身份验证、日志记录等。
而且这个坑牛逼之处在于我们可以借由它实现在最开始的开始和最后的最后做操作多加理解底下会详细讲解。
结合实战讲解—通过覆写wsgi_app函数实现一个简单的中间件
from flask import Flaskapp Flask(__name__)class MyMiddleware:def __init__(self, old_wsgi_app):# 服务端启动时自动执行self.old_wsgi_app old_wsgi_appdef __call__(self, environ, start_response):# 每次有用户请求到来时执行# 在请求到达视图函数之前执行的代码print(Before request)# 调用原始的wsgi_app函数处理请求response self.old_wsgi_app(environ, start_response)# 在响应发送给客户端之前执行的代码print(After request)return responseapp.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__方法并且接受environ和start_response参数这是遵守WSGI规范。
而且看Flask的wsgi_app函数源码也是如此 需要注意的是在print(Before request)部分做操作时只有原生的请求相关的数据environ所以就只能对原生的environ做操作 request和session是都没有的
二、应用点
通过覆写wsgi_app函数实现的自定义中间件可以有如下几种在开发时的应用点 可以对请求进行预处理通过覆写wsgi_app函数可以在请求到达视图函数之前执行一些代码逻辑例如身份验证、参数解析、请求日志记录等。这样可以方便地对请求进行预处理并根据需要做出相应的处理。 可以对响应进行后处理同样地在覆写wsgi_app函数时还可以在响应发送给客户端之前执行一些代码逻辑例如响应的加工、错误处理、响应日志记录等。这样可以方便地对响应进行后处理以满足特定的需求。 可以实现自定义中间件功能通过覆写wsgi_app函数可以实现自定义的中间件功能。中间件是一种可重用的组件可以用于添加额外的逻辑或修改请求/响应的行为。可以根据具体需求编写自己的中间件并将其插入Flask应用程序对象的处理流程中。 可以实现多个中间件的串联Flask允许使用多个中间件并且这些中间件可以按照特定的顺序串联起来。通过覆写wsgi_app函数可以轻松地将多个中间件组合起来形成一个中间件链条。每个中间件都可以独立地处理请求和响应并将处理结果传递给下一个中间件。 可以修改请求和响应通过覆写wsgi_app函数可以自由地修改请求和响应对象。这包括添加、删除或修改请求头部信息修改请求体内容修改响应状态码添加响应头部信息等。这样可以实现更加灵活和定制化的请求/响应处理。
总而言之覆写wsgi_app函数实现中间件提供了对请求和响应进行预处理和后处理的能力同时也允许编写自定义的中间件功能。这样可以增强Flask应用程序的功能和灵活性满足特定的需求。
就比如要做IP黑名单就可以在before里直接写逻辑environ里有请求IP信息这样就可以在最开始的开始直接限制
拓展
1在Python中当一个对象后面能加括号那么这个对象可能是什么 函数一个函数是可调用的对象。通过在函数名后加上括号可以执行该函数并传递相应的参数。 方法方法是属于类的函数。通过在实例或类名后加上括号可以调用该方法并传递相应的参数。 类类本身也是可调用的对象。通过在类名后加上括号可以创建类的实例。 对象某个类的实例对象也可以是可调用的对象。通过在对象名后加上括号可以调用该对象所属类中定义的特殊方法例如__call__()方法。
2在Python中函数和方法分别是什么
首先要认识到在Python中函数function和方法method是两种不同的概念。这也是为啥我给的问题是“函数和方法分别是什么” 函数function是一段封装了特定功能的可重用代码块。它接收输入参数执行特定的操作并返回结果。 函数可以在任何地方定义和使用不依赖于任何类或对象。它们通常用于模块化代码、提高代码的复用性和可维护性。 例如下面是一个简单的函数示例
def add(a, b):return a bresult add(2, 3)
print(result) **方法method是属于某个类的函数。**它定义在类的内部并且可以访问类的属性和其他方法。**方法通过对类的实例进行调用来执行相应的操作。**每个方法的第一个参数通常都是 self它表示方法所属的实例对象。 例如下面是一个简单的类和方法示例
class Circle:def __init__(self, radius):self.radius radiusdef area(self):return 3.14 * self.radius * self.radiuscircle Circle(5)
circle_area circle.area()
print(circle_area) # 输出78.5在上面的示例中area() 是 Circle 类的一个方法它可以通过 circle.area() 的方式进行调用。
需要注意的是对于一个类里面的函数它究竟真是函数还是方法取决于谁调用它
举个例子 上图中Test.index执行的话此时index作为函数意思是执行类里面的函数
而下面是通过类的实例调用所以此时是方法。
或者这样也能证明
from types import MethodType, FunctionTypeclass Test(object):def index(self):pass# print(Test.index)
print(isinstance(Test.index, FunctionType))test Test()
# print(test.index)
print(isinstance(test.index, MethodType)) 总结函数是独立的可调用代码块而方法是属于类的函数需要通过类的实例进行调用。