zoukankan      html  css  js  c++  java
  • Flask快速入门(20) — 多app应用

    Flask快速入门(20) — 多app应用

    之前一直是一个app,如果有多个app该怎么进行分发呢?

    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__方法。源码:

    # 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)
    
  • 相关阅读:
    第十七节:织梦做自定义表单在线预约的方法
    ExecuteNonQuery()返回值
    WCF服务编程读书笔记(6):错误
    ubuntu 工作区切换快捷键设置
    a pubhub service
    淘宝提供了Rubygems的国内镜像站点 ruby rails源
    新rails安装过程记录
    XMLRPC HOWTO
    XMLRPC HOWTO
    metaweblog api相关
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11708508.html
Copyright © 2011-2022 走看看