以前一直是一個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)