Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何用WSGI实现Flask应用程序的路径调度?_Python_Path_Flask_Wsgi_Dispatch - Fatal编程技术网

Python 如何用WSGI实现Flask应用程序的路径调度?

Python 如何用WSGI实现Flask应用程序的路径调度?,python,path,flask,wsgi,dispatch,Python,Path,Flask,Wsgi,Dispatch,我希望使用单个域作为多个flask应用程序的暂存环境,这些应用程序最终将在它们自己的域上运行 比如: 示例_staging.com/app1 示例_staging.com/app2 示例_staging.com/app3 其中: 示例_staging.com/app1的作用与app1.example_staging.com相同 示例_staging.com/app2的作用与app2.example_staging.com相同 示例_staging.com/app3的作用与app3.exam

我希望使用单个域作为多个flask应用程序的暂存环境,这些应用程序最终将在它们自己的域上运行

比如:

  • 示例_staging.com/app1
  • 示例_staging.com/app2
  • 示例_staging.com/app3
其中:

  • 示例_staging.com/app1的作用与app1.example_staging.com相同
  • 示例_staging.com/app2的作用与app2.example_staging.com相同
  • 示例_staging.com/app3的作用与app3.example_staging.com相同
或:

  • 示例_staging.com/app1的作用与app1.com相同
  • 示例_staging.com/app2的作用与app2.com相同
  • 示例_staging.com/app3的作用与app3.com相同
初学者应用程序:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello from Flask!'
WSGI启动程序配置文件:

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
提及:

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

注意:使用pythonawhere

解决方案

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
})
文件夹结构:

app1 folder
    app2 folder
    app3 folder

这里需要注意的关键是,你实际上有4个应用程序(3个单独的应用程序和一个组合应用程序)。这忽略了staging/live的区别,因为staging和live只是不同目录中彼此的副本

创建每个应用程序,并让它们在各自的域上做出响应。然后创建一个新的应用程序,从各个应用程序导入
应用程序
变量,并使用
DispatcherMiddle软件
将它们组合起来,就像您链接到的文档页面上标题“组合应用程序”下的示例一样。

这对我来说很有效:

文件夹结构

DISPATCHER (folder)
   dispatcher.py

   app1 (folder)
       __init__.py

   app2 (folder)
       __init__.py

   app3 (folder)
       __init__.py
dispatcher.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()
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()
app1到app3init.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()
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()
工作

python dispatcher.py

localhost:5000/app1 "Hi im one"
localhost:5000/app2 "Hi im two"
localhost:5000/app3 "Hi im three"
另一种配置

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

这有帮助


有没有可能与大家分享一个更加通俗易懂的例子?这看起来非常好,除非你说
python app.py
。您没有名为app.py的文件