IIS 10部署Flask时wfastcgi定位app.py的机制咨询
wfastcgi定位app.py的机制说明
问题场景
- 部署环境:IIS 10 上托管 Flask 应用,wfastcgi 已部署至应用目录,应用入口文件为
app.py - 测试现象1:应用目录下曾放置仅包含空配置节点的
web.config,文件内容如下:
<configuration> </configuration>
删除该空配置文件后站点仍可正常访问,排查站点对应层级目录未找到其他 web.config 文件。
- 测试现象2:移除目录下的
app.py文件后,页面返回 WSGI handler 读取错误,报错信息如下:
Error occurred while reading WSGI handler: Traceback (most recent call last): File "C:\Users\Terry Phillips\Documents\ADXF\ADXF-Python\ACINT-WebServices\TACINT-WebService\wfastcgi.py", line 791, in main env, handler = read_wsgi_handler(response.physical_path) File "C:\Users\Terry Phillips\Documents\ADXF\ADXF-Python\ACINT-WebServices\TACINT-WebService\wfastcgi.py", line 633, in read_wsgi_handler handler = get_wsgi_handler(os.getenv("WSGI_HANDLER")) File "C:\Users\Terry Phillips\Documents\ADXF\ADXF-Python\ACINT-WebServices\TACINT-WebService\wfastcgi.py", line 616, in get_wsgi_handler raise ValueError('"%s" could not be imported%s' % (handler_name, last_tb)) ValueError: "app.app" could not be imported: Traceback (most recent call last): File "C:\Users\Terry Phillips\Documents\ADXF\ADXF-Python\ACINT-WebServices\TACINT-WebService\wfastcgi.py", line 600, in get_wsgi_handler handler = __import__(module_name, fromlist=[name_list[0][0]]) ModuleNotFoundError: No module named 'app'
核心原因
wfastcgi 本身不会主动扫描目录找 app.py,它的入口定位完全依赖IIS传递的FastCGI环境变量,你找不到配置是因为配置根本没放在应用目录下的 web.config 里:
- IIS的配置是层级继承的,服务器全局配置、站点级配置、应用程序级配置、目录级web.config配置会按优先级叠加生效。你当初给站点配置wfastcgi处理程序映射时,核心的FastCGI环境变量(包括
WSGI_HANDLER、PYTHONPATH)已经被写到了IIS全局配置文件C:\Windows\System32\inetsrv\config\applicationHost.config里,属于服务器/站点级别的配置,和你应用目录下放的空web.config没有关系。那个空文件本来就没写任何wfastcgi相关参数,删了自然不会影响站点运行。 - 从报错信息可以直接看到,当前配置的
WSGI_HANDLER值为app.app,wfastcgi启动时的执行逻辑是:- 先把当前请求对应的物理路径(也就是你部署wfastcgi.py的应用目录)加入Python的模块搜索路径
- 读取
WSGI_HANDLER环境变量值,按.拆分模块名和可调用对象名:第一部分app对应要导入的模块,也就是目录下的app.py文件,第二部分app对应模块内的Flask应用实例对象 - 动态导入对应模块、取出可调用对象作为WSGI处理入口
- 你删除
app.py后,Python在搜索路径里找不到名为app的模块,就会抛出你看到的No module named 'app'错误。
验证方法
你可以直接打开IIS管理器,选中对应站点后进入「处理程序映射」设置,找到绑定的wfastcgi处理项,编辑对应的FastCGI应用设置,就能看到提前配置好的WSGI_HANDLER = app.app、PYTHONPATH指向应用目录的参数,和报错里的逻辑完全对应。
内容的提问来源于stack exchange,提问作者Terry Phillips
相关产品推荐
相关产品推荐

