IIS 上的多个 Python Flask 站点

问题描述 投票:0回答:3

我想运行三个独立的 Python Flask URL,我们将它们称为测试、登台和生产。我想要一个 IIS 网站来提供这三种不同的应用程序。

所以我创建了一个网站,在该网站下创建了三个 IIS 应用程序,并将它们的根文件夹分别设置为 d: xecution est、d: xecution\staging、d: xecution\prod。

在每个文件夹下都有一个 hello_world.py,如下所示

import datetime
from flask import Flask

app = Flask(__name__)

@app.route('/test')
def hello_world():
    return 'Hello World (Test)!' + datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")

if __name__ == '__main__':
    app.run(debug=True) 

显然,根据需要将路由更改为 /test、/staging 和 /prod 每个文件夹还包含一个如下所示的 web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <defaultDocument>
            <files>
                <add value="hello_world.py" />
            </files>
        </defaultDocument>
        <directoryBrowse enabled="true" />       
    </system.webServer>
    <system.web>
        <identity impersonate="false" />
    </system.web>
    <appSettings>
        <add key="PYTHONPATH" value="D:\Execution\Test" />
        <add key="WSGI_HANDLER" value="hello_world.app" />
    </appSettings>
</configuration>

再次根据需要更改 PYTHONPATH

主网站根目录中有一个 web.config,上面写着

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <add name="Python Flask" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Python34\python.exe|C:\Python34\Lib\site-packages\wfastcgi.py" resourceType="Unspecified" />
        </handlers>
    </system.webServer>
</configuration>

这是 python 处理程序。如果我把它拿出来,我可以从网站和三个应用程序子文件夹/URL 中提供基本的 HTML 页面。如果我把它放回去,我什么也得不到,甚至连一个基本的 HTML 页面也得不到。当我尝试导航到任何内容时,无论是目录浏览、index.html 还是如上所述的 http://server:port/test 应用程序路由,IIS 都会抛出通用的“找不到网页。HTTP 404 Not Found”上面是我的 python Flask 应用程序。

有人对我做错了什么有什么建议吗?

python asp.net iis flask
3个回答
0
投票

我认为问题的根源在于您的站点指定了一个基于

CGI
的处理程序,该处理程序将覆盖您为每个应用程序提供的
wsgi_handler
值。

..你真的打算在cgi上运行wsgi吗? 如果您的答案是否定的,那么这绝对可能是您的问题。


0
投票

我知道这是一个老问题,但我有类似的问题,并找到了一个可以帮助人们使用 Flask + IIS 的解决方案:

解决方案:使用蓝图...每个应用程序都应设置蓝图 URL,包括虚拟目录(应用程序)的名称

例如,如果 IIS 上有以下结构:

DefaultWebSite
   \YourFlaskApp01
   \YourFlaskApp02
   ...

在 YourFlaskApp01 代码上设置 Flask 蓝图:

bpname = flask.Blueprint('bpname', __name__, url_prefix='/YourFlaskApp01')

在 YourFlaskApp02 代码上设置 Flask 蓝图:

bpname = flask.Blueprint('bpname', __name__, url_prefix='/YourFlaskApp02')

并在端点方法上使用蓝图:

@bpname.route("/foo", methods=["GET"])
def foo():
   ...

如果您不使用蓝图,我想如果您直接设置正确的设置,它也可以工作

@app.route('/YourFlaskApp01/test')

但是我没有测试过。 :(

在 IIS 上,请记住始终向与应用程序池关联的用户授予适当的权限。

设置 Flask + IIS 的一般说明:

Microsoft Learn - 为 IIS 配置 Python Web 应用程序

Medium.com - 在 IIS 服务器中部署 Python Flask 应用程序并在计算机 IP 地址上运行

Flask - 带有蓝图的模块化应用程序

希望这可以帮助别人!


0
投票

我设法使用虚拟环境解决了这个问题,以便每个应用程序都使用自己的 fastcgi 副本。

查找具有 2 个 API 的示例:

- flask_api_A: @app.route("/")
- flask_api_B: @app.route("/flaskapib/v1", methods=["GET"])
  1. 逐一激活环境并

    pip install wfastcgi

  2. 在 IIS 上编辑 FastCGI 设置:

  • env_A
    :在集合编辑器中设置ENV变量:PYTHONPATH + WSGI_HANDLER(路径将是flask_api_A.py的父文件夹,WSGI_HANDLER将是flask_api_A.app)
  • env_B
    :为第二个API相应设置2个变量
  1. 在 IIS 上的站点下:
  • 设置 2 个处理程序
    • FlaskHandler1:

      • Request path: *
      • 模块:FastCgiModule
      • 可执行文件:
        env_A\Scripts\python.exe|env_A\lib\site-packages\wfastcgi.py
    • FlaskHandler2:

      • Request path: /flaskapib/v1*
      • 模块:FastCgiModule
      • 可执行文件:
        env_B\Scripts\python.exe|env_B\lib\site-packages\wfastcgi.py

这样:

  • server_address:port/ 将指向
    flask_api_A
  • server_address:port/flaskapib/v1 将指向
    flask_api_B
© www.soinside.com 2019 - 2024. All rights reserved.