为IIS配置python

时间:2019-04-11 21:14:34

标签: python iis flask

按照https://docs.microsoft.com/en-us/visualstudio/python/configure-web-apps-for-iis-windows?view=vs-2019中的步骤将flask应用程序配置为在IIS后面运行并在线搜索,找不到解决我问题的解决方案。

我的web.config为:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="PythonHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
    </handlers>
    <httpPlatform processPath="C:\envs\Scripts\python.exe"
                  arguments="-m flask run --port %HTTP_PLATFORM_PORT%"
                  stdoutLogEnabled="true"
                  stdoutLogFile="C:\logs\python.log"
                  startupTimeLimit="60"
                  processesPerApplication="16">
      <environmentVariables>
        <environmentVariable name="FLASK_APP" value="app.py" />
      </environmentVariables>
    </httpPlatform>
  </system.webServer>
</configuration>

访问该网站只会吐出以下内容。我尝试了所有可能的解决方案,包括授予IIS_IUSRS访问权限。在命令提示符下运行应用程序运行正常。 IIS错误消息没有帮助。

enter image description here

编辑:

在安装了http platformhandler之后,现在将其安装在不同的开发盒中,我可以看到该处理程序在工作,但只是一个怪物:502.3 Bad Gateway

详细的错误信息:

模块 httpPlatformHandler 请求的URL http://127.0.0.1:5007/about

通知 ExecuteRequestHandler 物理路径 C:\ inetpub \ wwwroot \ app \ about

处理程序 PythonHandler 登录方法匿名

错误代码 0x8007042b 登录用户匿名

这告诉我处理程序只是将url处理为应用程序根目录中的文件夹,因为http://127.0.0.1:5007/about只是通往以下内容的途径

myapp_about.py:

from flask import Blueprint, jsonify

myapp_about = Blueprint('about', __name__)


@myapp_about.route('/about')
def get_about():
    return jsonify({"wow": "We really are routed to here. maybe not"})

3 个答案:

答案 0 :(得分:0)

在这些说明中没有看到任何内容,但是我认为您的问题是HttpPlatformHandler。尝试删除该错误,看看是否有更好/不同的错误。 HttpPlatformHandler不是IIS的默认配置元素,需要添加,很可能是通过安装类似https://www.iis.net/downloads/microsoft/httpplatformhandler的方法来添加的。

答案 1 :(得分:0)

有相同的问题,并在下面进行了工作。 “付出了很多努力,但我努力了

必须安装HttpPlatform https://www.iis.net/downloads/microsoft/httpplatformhandler 配置编辑器system.webServer / httpPlatform(部分未锁定) 确保应用程序具有日志路径stdoutLogFile =“ c:\ home \ LogFiles \ python.log”的权限 必须设置app.run(port = PORT)PORT = int(environ.get('SERVER_PORT','5555')) 设置防火墙以允许HTTP传入请求”

答案 2 :(得分:0)

这在Windows 10和Windows Server 2019上都使用IIS 10.0为我工作。如其他答案中所述,您必须安装 HttpPlatformHandler 。 (通过Windows Platform Installer下载。)

我的web.config的<handlers>部分已锁定,因此,我没有直接编辑web.config,而是对IIS 使用了 Add Module Mapping ... 操作。 > Handler Mappings GUI以添加Python处理程序:

Image of Python handler

您还可以直接通过IIS管理器的GUI编辑网站配置:

IIS Configuration Editor

我为FLASK_APP环境变量使用了绝对路径,但是似乎也可以使用它。 (实际上,如果您使用默认的Flask应用名称​​ app.py ,则可以完全忽略环境变量。)

web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpPlatform processPath="C:\Python37\python.exe"
                      arguments="-m flask run --port %HTTP_PLATFORM_PORT%"
                      stdoutLogEnabled="true"
                      stdoutLogFile="C:\inetpub\logs\LogFiles\python.log"
                      startupTimeLimit="60"
                      processesPerApplication="16">
          <environmentVariables>
              <environmentVariable name="FLASK_APP" value="C:\inetpub\wwwroot\hello.py" />
          </environmentVariables>
        </httpPlatform>
    </system.webServer>
</configuration>

这与下面的最小Flask应用程序一起使用。 (也许在添加 Blueprint 和其他端口号之前尝试一下。)

hello.py

from flask import Flask

app = Flask(__name__)

@app.route('/hi')
def hello_world():
    return 'Hello, World!'

Image of browser output

有关Windows安全权限的说明:

  • 对于IIS管理器中的“处理程序映射”,没有必要执行检查权限。 (脚本权限是默认权限,可以按原样工作。)
  • IIS IUSR对 python.exe flask.exe 具有执行权限不是必需的
  • IIS _IUSR对 app.py hello.py 具有执行权限不是必需的
  • 如果启用了日志记录,则IIS_IUSR 必须具有对目标文件夹(例如 C:\ inetpub \ logs \ LogFiles )的写入权限-不仅在 python.log 文件上,因为它可能会在指定的日志文件名中添加一个额外的后缀。