Flask中间件 & Blueprint

984 阅读2分钟

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

中间件

Flask和django类似,都有中间件,下面代码就是自定义中间件的一种方式:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return 'Hello World!'
# 模拟中间件
class Md(object):
    def __init__(self,old_wsgi_app):
        self.old_wsgi_app = old_wsgi_app

    def __call__(self,  environ, start_response):
        print('开始之前')
        ret = self.old_wsgi_app(environ, start_response)
        print('结束之后')
        return ret

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

当执行app.run()方法的时候,最终执行的是run_simple,最后执行app(),就是执行app.__call__方法。

__call__方法中,执行的是self.wsgi_app().那我们希望在执行他本身的wsgi之前做点事情。

所以可以自定义一个类Md,在类中的__init__方法中保存之前的wsgi_app方法,然后实例化Md类的对象---新的wsgi_app对象。

再执行app.run()就会执行新的wsgi_app,就是执行Md类中的__call__方法。

blueprint(蓝图)

在在没有蓝图之前,flask都是单文件的,对于中大型项目来说,单文件管理起来非常费劲,但是蓝图可以帮助解决这个问题,让flask项目也能像django一样对程序文件进行分门别类。 当然就是因为这样,越来越多的人说flask虽然小但是第三方的库很多,当flask框架结合了很多其他的库时功能甚至可以超过django。

有了蓝图之后可以分文件,分app,之前的请求扩展还是一样用,只是在当前蓝图对象管理下的有效。

蓝图的基本使用如下:

#第一步在app中注册蓝图,括号里是一个蓝图对象
    app.register_blueprint(user.us)
	# 第二步,在不同文件中注册路由时,直接使用蓝图对象注册,不用使用app了,避免了循环导入的问题
    @account.route('/login.html', methods=['GET', "POST"])

flask路由本质

flask路由是装饰器实现的:

@app.route('/', methods=['GET', 'POST'], endpoint='login')
def login():
    pass

通过route进入源码部分

image-20200921190536190

路由装饰器的本质就是add_url_rule()

需要注意的是endpoint不写的话默认就是视图函数的函数名,不能重复。

add_url_rule函数的参数解析如下:

@app.route和app.add_url_rule参数:
rule, URL规则
view_func, 视图函数名称
defaults = None, 默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'}
为函数提供参数
endpoint = None, 名称,用于反向生成URL,即: url_for('名称')
methods = None, 允许的请求方式,如:["GET", "POST"]
#对URL最后的 / 符号是否严格要求,默认严格,False,就是不严格
strict_slashes = None
    '''
        @app.route('/index', strict_slashes=False)
        #访问http://www.xx.com/index/ 或http://www.xx.com/index均可
        @app.route('/index', strict_slashes=True)
        #仅访问http://www.xx.com/index
    '''
#重定向到指定地址
redirect_to = None, 
    '''
        @app.route('/index/<int:nid>', redirect_to='/home/<nid>')
    '''

结语

文章首发于微信公众号程序媛小庄,同步于掘金

码字不易,转载请说明出处,走过路过的小伙伴们伸出可爱的小指头点个赞再走吧(╹▽╹)