使用vercel.json部署Flask应用时遇模块导入与handler/app缺失错误
解决Vercel部署多文件Flask应用的模块找不到与Handler缺失问题
一、修复模块导入失败问题
Vercel的Python Serverless函数默认从api目录加载代码,模块找不到的核心原因是导入路径不正确,按以下步骤调整:
- 调整目录结构:将
ScraperAPI.py、ProcessSearcher.py与main.py放在同一个api目录下,同时在该目录添加空的__init__.py文件,让Python识别为可导入的包。最终目录结构应为:项目根目录/ ├── api/ │ ├── main.py │ ├── ScraperAPI.py │ ├── ProcessSearcher.py │ └── __init__.py ├── vercel.json └── requirements.txt - 修正导入语句:在
main.py中使用相对导入,比如:from .ScraperAPI import app # 若ScraperAPI中已定义Flask实例 from .ProcessSearcher import 你的处理函数名
二、解决「Missing variable handler or app」错误
Vercel要求Python函数文件必须在全局作用域暴露app(Flask实例)或handler(WSGI handler),按以下处理:
- 暴露Flask实例:确保
main.py的全局作用域中有app变量,且不要将其包裹在if __name__ == "__main__":代码块中(Vercel执行时不会触发该条件)。示例:# main.py from flask import Flask from .ProcessSearcher import handle_post # 直接在全局创建或导入Flask实例 app = Flask(__name__) # 注册路由 @app.route('/search', methods=['POST']) def search(): return handle_post() # 移除或注释掉本地运行的代码块,避免影响部署 # if __name__ == "__main__": # app.run(debug=True) - 如果使用工厂模式:若
ScraperAPI.py是用工厂函数创建app,需在main.py中调用函数并赋值给全局app:from .ScraperAPI import create_app app = create_app()
三、调整vercel.json配置
修正重写规则的目标路径,无需添加.py后缀:
{ "rewrites": [ { "source": "/(.*)", "destination": "/api/main" } ] }
四、额外检查项
- 确保项目根目录的
requirements.txt包含所有依赖包(比如flask、requests等),Vercel会自动安装。 - 部署前本地测试:在
api目录下运行python main.py,确认模块导入和Flask服务正常启动。
内容的提问来源于stack exchange,提问作者Pedroblome
相关产品推荐
相关产品推荐

