如何使用WSGI实现Flask应用程序调度?

det*_*ead 3 python wsgi path dispatch flask

我想将单个域用作多个烧瓶应用程序的临时环境,这些应用程序最终将在自己的域上运行.

就像是:

  • example_staging.com/app1
  • example_staging.com/app2
  • example_staging.com/app3

哪里:

  • example_staging.com/app1与app1.example_staging.com的行为相同
  • example_staging.com/app2与app2.example_staging.com的行为相同
  • example_staging.com/app3与app3.example_staging.com的行为相同

要么:

  • example_staging.com/app1与app1.com的行为相同
  • example_staging.com/app2与app2.com的行为相同
  • example_staging.com/app3与app3.com的行为相同

入门应用:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello from Flask!'
Run Code Online (Sandbox Code Playgroud)

WSGI Starter配置文件:

import sys

project_home = u'/home/path/sample1'

if project_home not in sys.path:
    sys.path = [project_home] + sys.path

from app import app as application
Run Code Online (Sandbox Code Playgroud)

指的是:

http://flask.pocoo.org/docs/0.10/patterns/appdispatch/

我不知道在文档中给出的代码添加位置作为示例,以及create_app,default_app,get_user_for_prefix应该是什么样子.

注意:使用PythonAnywhere

Glenns输入后的WSGI配置文件:

import sys

# add your project directory to the sys.path
project_home = u'/home/path/app1'
if project_home not in sys.path:
    sys.path = [project_home] + sys.path

from werkzeug.wsgi import DispatcherMiddleware
from app import app as app1
from app2.app import app as app2
from app3.app import app as app3

application = DispatcherMiddleware(app1, {
    '/app2':    app2,
    '/app3':    app3
})
Run Code Online (Sandbox Code Playgroud)

文件夹结构:

app1 folder
    app2 folder
    app3 folder
Run Code Online (Sandbox Code Playgroud)

小智 7

这对我有用:

文件夹结构

DISPATCHER (folder)
   dispatcher.py

   app1 (folder)
       __init__.py

   app2 (folder)
       __init__.py

   app3 (folder)
       __init__.py
Run Code Online (Sandbox Code Playgroud)

调度程序.py

from flask import Flask
from werkzeug.wsgi import DispatcherMiddleware #use the commented version below for Werkzeug >= v.1.0
#from werkzeug.middleware.dispatcher import DispatcherMiddleware
from werkzeug.exceptions import NotFound

from app1 import app as app1
from app2 import app as app2
from app3 import app as app3

app = Flask(__name__)

app.wsgi_app = DispatcherMiddleware(NotFound(), {
    "/app1": app1,
    '/app2': app2,
    '/app3': app3
})

if __name__ == "__main__":
    app.run()
Run Code Online (Sandbox Code Playgroud)

app1 到 app3 init .py

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index_one():
    return "Hi im 1 or 2 or 3"

if __name__ == "__main__":
    app.run()
Run Code Online (Sandbox Code Playgroud)

在职的

python dispatcher.py

localhost:5000/app1 "Hi im one"
localhost:5000/app2 "Hi im two"
localhost:5000/app3 "Hi im three"
Run Code Online (Sandbox Code Playgroud)

另一种配置

您可以导入另一个应用程序,例如 app0 并向应用程序添加菜单,使用 NotFound()

这有助于

应用调度


Gle*_*enn 5

这里需要注意的关键是,您实际上将拥有4个应用程序(3个应用程序和1个组合应用程序).这忽略了暂存/现场区别,因为暂存和实时只是不同目录中彼此的副本.

创建每个单独的应用程序,并让他们在各自的域上做出响应.然后创建一个新的应用程序,application从各个应用程序导入变量,并使用DispatcherMiddleware您链接到的文档页面上的"组合应用程序"标题下的示例将它们组合起来.