一、中间件(了解)
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__':
aaa=Md(app.wsgi_app)
app.wsgi_app = aaa
app.run()
二、蓝图
1、什么是蓝图,有什么作用?
蓝图是一个类的对象
用来划分项目目录,避免使用app划分目录的时候出现循环导入问题
2、使用步骤:
from flask import Blueprint
account = Blueprint('account', __name__)
@account.route('/login.html', methods=['GET', "POST"])
def login():
return render_template('login.html')
from .views.account import account
app.register_blueprint(account)
3、注意点
app.register_blueprint(admin, url_prefix='/admin')
web = Blueprint('web',__name__,template_folder='templates',static_folder='static')
web = Blueprint('web', __name__,template_folder='templates',static_folder='static')
@web.before_request
def web_request():
print('web request')
@web.after_request
def web_after(response):
print(response)
return response
三、flask请求上下文
1 当flask启动后,等待客户端请求
2 一旦请求来了:app()--->app.__call__()---->app.wsgi_app()
3 wsgi_app()源码如下:(flask执行流程)
ctx = self.request_context(environ)
error = None
try:
try:
'''
def push(self, obj):
rv = getattr(self._local, "stack", None)
if rv is None:
self._local.stack = rv = []
rv.append(obj)
return rv
'''
ctx.push()
response = self.full_dispatch_request()
except Exception as e:
error = e
response = self.handle_exception(e)
except:
error = sys.exc_info()[1]
raise
return response(environ, start_response)
finally:
if self.should_ignore_error(error):
error = None
ctx.auto_pop(error)