Windows环境下Flask+Apache部署出现'module' object is not callable错误求助
问题背景
近期在Windows系统中搭建Apache服务器部署Flask应用,部署步骤如下:
- 通过Apache Lounge下载Apache并解压至
C:\Apache24; - 在Python 3.7.7虚拟环境中安装mod_wsgi;
- 将mod_wsgi配置添加至httpd.conf文件;
- 在Apache的conf目录中创建应用配置文件。
Apache的error.log中出现如下错误:
[Fri Nov 11 18:44:00.985814 2022] [wsgi:error] [pid 9456:tid 1396] [client 127.0.0.1:58152] mod_wsgi (pid=9456): Exception occurred processing WSGI script 'J:/tools/pipecrew/ashish/workspace/tools/wsgi_scripts/shotgrid_ami_handler.wsgi'. [Fri Nov 11 18:44:00.985814 2022] [wsgi:error] [pid 9456:tid 1396] [client 127.0.0.1:58152] TypeError: 'module' object is not callable [Fri Nov 11 18:44:01.020776 2022] [wsgi:error] [pid 9456:tid 1392] [client 127.0.0.1:58153] mod_wsgi (pid=9456): Exception occurred processing WSGI script 'J:/tools/pipecrew/ashish/workspace/tools/wsgi_scripts/shotgrid_ami_handler.wsgi'., referer: http://fpservices.in/boom [Fri Nov 11 18:44:01.020776 2022] [wsgi:error] [pid 9456:tid 1392] [client 127.0.0.1:58153] TypeError: 'module' object is not callable, referer: http://fpservices.in/boom
相关配置片段
1. Apache httpd.conf配置
LoadFile "J:/tools/rez_packages/python/3.7.7/platform-windows/python37.dll" LoadModule wsgi_module "D:/virtual_python/python-3/mod_wsgi/lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd" WSGIPythonHome "D:/virtual_python/python-3/mod_wsgi" # Include Flask File Include conf/shotgrid_ami_handler.conf
2. Flask应用配置文件(conf/shotgrid_ami_handler.conf)
<VirtualHost *:80> ServerName fpservices.in WSGIScriptAlias / J:/tools/pipecrew/ashish/workspace/tools/wsgi_scripts/shotgrid_ami_handler.wsgi <Directory J:/tools/pipecrew/ashish/workspace/tools/shotgrid_ami_handler> WSGIScriptReloading On Require all granted </Directory> </VirtualHost>
3. WSGI文件(shotgrid_ami_handler.wsgi)
import sys sys.path.insert(0, 'J:\\tools\\pipecrew\\ashish\\workspace\\tools') from shotgrid_ami_handler import app as application
4. Flask应用代码(shotgrid_ami_handler.py)
from flask import Flask, request, Response app = Flask(__name__) @app.route('/boom', methods=['GET', 'POST']) def boom(): return 'boom!' if __name__ == '__main__': app.run(host='0.0.0.0', port=4576, debug=True)
错误原因与解决方法
核心问题
TypeError: 'module' object is not callable的本质是:mod_wsgi期望application是可调用的WSGI应用对象(即Flask的app实例),但当前导入的app实际是一个模块而非Flask实例。
触发原因
WSGI文件中sys.path添加的路径是J:\\tools\\pipecrew\\ashish\\workspace\\tools,而Flask应用代码所在目录是J:\\tools\\pipecrew\\ashish\\workspace\\tools\\shotgrid_ami_handler。执行from shotgrid_ami_handler import app时,Python将shotgrid_ami_handler识别为tools目录下的模块(可能存在同名文件夹或文件导入优先级问题),而非实际的Flask应用模块。
修复步骤
调整WSGI文件的路径导入
修改WSGI文件,将sys.path指向Flask应用所在的父目录,确保正确导入Flask实例:import sys # 指向包含Flask应用文件/目录的路径 sys.path.insert(0, 'J:\\tools\\pipecrew\\ashish\\workspace\\tools\\shotgrid_ami_handler') from shotgrid_ami_handler import app as application若Flask应用代码直接在
tools目录下的shotgrid_ami_handler.py文件中,需检查tools目录下是否有同名的shotgrid_ami_handler文件夹,避免Python优先导入文件夹作为模块。验证导入有效性
可在WSGI文件中添加调试代码,确认导入内容:import sys sys.path.insert(0, 'J:\\tools\\pipecrew\\ashish\\workspace\\tools') import shotgrid_ami_handler print(type(shotgrid_ami_handler)) # 若输出<class 'module'>,说明导入的是模块而非实例 print(dir(shotgrid_ami_handler)) # 查看模块成员,确认是否存在app属性执行后查看Apache的error.log,确认导入内容是否符合预期。
规范目录结构
确保文件目录结构清晰,避免同名冲突:J:\tools\pipecrew\ashish\workspace\tools\ ├── wsgi_scripts\ │ └── shotgrid_ami_handler.wsgi └── shotgrid_ami_handler\ └── shotgrid_ami_handler.py # 包含Flask app实例的文件或单文件结构:
J:\tools\pipecrew\ashish\workspace\tools\ ├── wsgi_scripts\ │ └── shotgrid_ami_handler.wsgi └── shotgrid_ami_handler.py # 包含Flask app实例的文件
内容的提问来源于stack exchange,提问作者Vicspidy

