以前一直是一个app,若是有多个app该怎么进行分发呢?python
from werkzeug.wsgi import DispatcherMiddleware from werkzeug.serving import run_simple from flask import Flask,current_app # 注册两个app app1 = Flask('app01') app2 = Flask('app02') @app1.route('/index') def index(): return 'app01' @app2.route('/index') def index(): return 'app02' dm = DispatcherMiddleware(app1,{ '/sec':app2, }) if __name__ == '__main__': run_simple('localhost',5000,dm)
dm是DispatcherMiddleware实例化对象,因此dm()调用时执行的是__call__
方法。源码:flask
# dm = DispatcherMiddleware(app1,{'/sec':app2}) def __init__(self, app, mounts=None): self.app = app self.mounts = mounts or {} def __call__(self, environ, start_response): script = environ.get("PATH_INFO", "") # 获取url信息,如url为http://127.0.0.1:5000/sec/index;此时获取到的script为‘/sec/index’ path_info = "" while "/" in script: # 此时 self.mounts = {'/sec':app2} if script in self.mounts: app = self.mounts[script] break script, last_item = script.rsplit("/", 1) # 循环从右边以/切分1次,给script从新赋值 path_info = "/%s%s" % (last_item, path_info) else: # 若是没有匹配上,app = app1,若是匹配上了app = self.mounts[script] 即app2 app = self.mounts.get(script, self.app) original_script_name = environ.get("SCRIPT_NAME", "") environ["SCRIPT_NAME"] = original_script_name + script environ["PATH_INFO"] = path_info return app(environ, start_response)