如何使用 HttpPlatformHandler 提供 Flask 应用程序?

如何使用 HttpPlatformHandler 提供 Flask 应用程序?

我正在尝试使用 Windows Server 2016 上 IIS 中的 HttpPlatformHandler 模块来使用 Flask 为用 Python 编写的基本应用程序提供服务。Python 环境使用 进行管理pipenv,Flask 应用程序目前只是一个基本的“Hello World”。这是我的web.config文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers accessPolicy="Read, Execute, Script">
            <add name="Flask" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
        </handlers>
        <httpPlatform processPath="C:\Users\dummyuser\.virtualenvs\inventory-z_DIyVzW\Scripts\flask.exe" arguments="run --port=%HTTP_PLATFORM_PORT%" stdoutLogEnabled="true">
            <environmentVariables>
                <environmentVariable name="FLASK_APP" value="hello.py" />
                <environmentVariable name="PYTHONPATH" value="S:\Web\inventory" />
            </environmentVariables>
        </httpPlatform>
    </system.webServer>
    <system.web>
        <customErrors mode="Off" />
    </system.web>
</configuration>

如果我从命令行启动应用程序并直接访问它,它运行良好,但当我尝试通过 IIS 访问它时,它就会停滞,我永远看不到任何输出。日志文件通常如下所示:

Traceback (most recent call last):
  File "C:\Program Files\Python37\Lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Program Files\Python37\Lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\dummyuser\.virtualenvs\inventory-z_DIyVzW\Scripts\flask.exe\__main__.py", line 5, in <module>
ModuleNotFoundError: No module named 'flask'

我如何让 IIS 启动并提供该应用程序?

(在研究这个问题时,我发现了一些使用 Waitress 之类的 WSGI 服务器的建议,但我认为使用 HttpPlatformHandler 而不是 FastCGI 方法意味着不需要 WSGI 服务器。我误解了这里的交互吗?)

答案1

  1. 不要使用虚拟环境,因为分散的文件会使调整文件权限变得困难。
  2. web.config当您使用女服务员作为应用服务器时,请考虑以下设置,
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" requireAccess="Script" />
        </handlers>
        <httpPlatform stdoutLogEnabled="true" stdoutLogFile=".\python.log" startupTimeLimit="20" processPath="C:\Users\lextudio\AppData\Local\Programs\Python\Python310\python.exe" arguments="-m waitress --port %HTTP_PLATFORM_PORT% wsgi:application">
        </httpPlatform>
    </system.webServer>
</configuration>

更多详细信息和故障排除提示可参见这个帖子

关于您关于开发服务器与生产应用服务器的问题,性能上的差异仍然是一个重要因素。

相关内容