Flask快速入門(20) — 多app應用

Flask快速入門(20) — 多app應用

以前一直是一個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)
相關文章
相關標籤/搜索