在 Windows Server 上部署 Flask 框架网页到 IIS 服务器

准备工作

把Flask框架网站放在某一路径, 我以C盘下Hello文件夹下的Python Flask框架 Hello.py为例。HTML文件在template里,static里是样式,log里是日志文件

python flask 服务器 关闭 flask server_Server

Windows Server 安装 IIS 服务器,勾选 CGI.

下载并安装Microsoft Web Platform Installer,在IIS Manager 界面 Management 点击Microsoft Web Platform Installer,安装URL Rewrite 2.1

python flask 服务器 关闭 flask server_Server_02

安装 wfastcgi

pip install wfastcgi

cd c:\python_dir\scripts #找到python路径
wfastcgi-enable

记录两个文件 python.exe 和 wfastcgi.py 路径:

c:\program files (x86)\python38-32\python.exe|c:\program files (x86)\python38-32\lib\site-packages\wfastcgi.py

wfastcgi-disable 关闭wfastcgi

添加web.config 文件

在python文件目录下创建web.config文件,有人说最好生成这个文件,我是自己创的没什么问题。
添加 Module Mapping 步骤后可以自动生成web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <security> 
        	<requestFiltering allowDoubleEscaping="true"></requestFiltering> 
    	</security>
        <directoryBrowse enabled="false" showFlags="Extension" />
        <handlers>
            <add name="flask" path="*" verb="*" modules="FastCgiModule" scriptProcessor="c:\program files (x86)\python38-32\python.exe|"c:\program files (x86)\python38-32\lib\site-packages\wfastcgi.py"" resourceType="Unspecified" />
        </handlers> 
    </system.webServer>
    <appSettings>
        <!-- 2个必须要有的参数: 
        @WSGI_HANDLER:fastCGI获得请求后调用的flask应用入口。
        @PYTHONPATH: 执行整个应用的项目目录
        -->
        <add key="WSGI_HANDLER" value="Hello.app" />
        <add key="PYTHONPATH" value="C:/Hello" />
    </appSettings>
</configuration>

把刚才cmd中的两个路径添加到scriptProcessor后
这里的add key中的 Hello.app 即包含app.run的 python程序的名字+app
PYTHONPATH 即是你自己写的flask python文件的路径,这里就是C:/Hello, Hello 文件夹下的Hello.py.
这里可能会添加不成功,不过没关系,一会儿可以手动添加

添加站点

在IIS Manager 页面左边 Server 下的 Sites 右键添加新站点,物理路径为Hello文件夹。

python flask 服务器 关闭 flask server_IIS_03

添加 Module Mapping

在你新创的站点控制台里双击进入Handler Mappings,右边Add Module Mapping。

(不要在IIS控制台直接进入,不然创建的FastCGI会对所有网站生效!)

Module 选 FastCgiModule

Executable 这一栏继续复制刚才的两个路径。由于它本身只支持dll 和 exe 文件,可能添加 wfastcgi.py 的路径的时候可能会出问题。我的解决方法是:python.exe 的路径不加双引号,wfastcgi.py 的路径加双引号。

python flask 服务器 关闭 flask server_IIS_04


Request Restrictions 选项点进去 Invoke handler only if request is mapped to 选项的勾去掉,除非你就想让网页显示文件夹目录,如果是这样的话,网站的Directory Browsing 选项需要启用。在这里不多叙述。

python flask 服务器 关闭 flask server_python_05

手动添加

回到IIS Manager主页面,找到FastCGISettings选项点击进去,可以看到刚添加的映射。双击点进去。

python flask 服务器 关闭 flask server_python flask 服务器 关闭_06


点击General 里的第一个Environment Variables,如果左边没有就手动添加PYTHONPATH和WSGI_HANDLER

python flask 服务器 关闭 flask server_python flask 服务器 关闭_07


python flask 服务器 关闭 flask server_IIS_08

配置 IIS 目录及权限

现在你需要让IIS用户拥有访问和执行你的网站脚本的权限,进入网站目录,执行下面两条命令:

cd C:\hello
icacls . /grant “NT AUTHORITY\IUSR:(OI)(CI)(RX)”
 icacls . /grant “Builtin\IIS_IUSRS:(OI)(CI)(RX)”

做到这里网站应该可以从iis里打开了。

如果还是因为没有权限报错可以把 Hello 文件夹分享给所有人。

如果发生HTTP 错误 500.19 - Internal Server Error,可以cmd试试以下命令
%windir%/system32/inetsrv/appcmd.exe set config -section:system.webServer/httpCompression /-[name=‘xpress’]

如果有其他问题可以浏览以下参考

Reference


https://www.bilibili.com/video/BV1w4411f74e?p=6