这是我参与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进入源码部分
路由装饰器的本质就是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>')
'''
结语
文章首发于微信公众号程序媛小庄,同步于掘金。
码字不易,转载请说明出处,走过路过的小伙伴们伸出可爱的小指头点个赞再走吧(╹▽╹)