【问题标题】:Configuring python for IIS为 IIS 配置 python
【发布时间】:2019-04-11 21:14:34
【问题描述】:

按照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 错误消息没有帮助。

编辑:

安装 http 平台处理程序后,现在在不同的开发盒上,我可以看到处理程序在工作,但只是一个不同的怪物:502.3 Bad Gateway

详细错误信息:

模块 httpPlatformHandler 请求的网址 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"})

【问题讨论】:

  • 你在iis中添加了python和fast cgi的处理程序映射吗?medium.com/@bilalbayasut/…
  • @JalpaPanchal 我使用的是 HttpPlatform 处理程序而不是 FastCGI 处理程序。
  • 你可能需要添加requireAccess:
  • @JalpaPanchal 我会试试那个,但我现在在另一个盒子上,并对问题进行了编辑。

标签: python iis flask


【解决方案1】:

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

我的 web.config 的 &lt;handlers&gt; 部分已锁定,因此我没有直接编辑 web.config,而是在 IIS Handler 上使用了 Add Module Mapping... 操作映射 GUI 添加 Python 处理程序:

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

我为 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!'

有关 Windows 安全权限的说明:

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

【讨论】:

  • @Murugan:我也让它在 Windows 10 上运行。在底部添加了一些具有检查权限的注释。 (最后一点让我沮丧了一段时间!)
  • 能发个视频教程吗?
  • @Dirco 我刚刚在hosts 文件中添加了一个条目,一切似乎都正常。 但是 我完全搞不懂编辑 bindings 和编辑 hosts 文件有什么区别?即使在官方 MS 文档中也没有提到 hosts 文件。
【解决方案2】:

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

【讨论】:

  • 安装 http platformhndler 是我遇到的解决方案之一,但没有帮助。并且删除模块条目基本上不会改变错误。
  • “基本上不会改变错误”是什么意思?我建立了一个全新的服务器,安装了 HttpPlatformHandler 并在你的 Web.config 上拍了拍。它修复了配置错误,然后因我没有安装 Python 而窒息
  • 那我不知道我在哪里搞砸了。我什至也尝试安装处理程序的 x86,但不幸的是我的 x64 windows 10 拒绝了它。
  • 通过您的任何尝试,错误是否发生了变化?
  • 在不同的盒子上进行了试用并进行了更新。我想现在我发现了一个完全不同的问题。
【解决方案3】:

有同样的问题,并在下面工作。 “费了很大的力气,但我终于成功了

必须安装HttpPlatformhttps://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-incoming 请求”

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多