我有一个非常基本的烧瓶应用程序,如下所示:
- vercel.json
- api/
---- app.py
---- my_module.py
vercel.json 看起来像这样:
{
"version": 2,
"builds": [
{
"src": "./api/app.py",
"use": "@vercel/python",
"config": {
"includeFiles": ["api/**"]
}
}
],
"routes": [
{ "src": "/(.*)", "dest": "/api/app.py" }
]
}
在 app.py 中我有
import my_module
。这对于我本地的开发环境来说完全没问题。然而,似乎如果我希望它在我的 vercel 托管上工作,我必须将导入更改为类似: from .my_module import some_function
以及前面的点。现在这不适用于我的本地实例。
有什么方法可以配置 vercel.json 以允许我在任何地方进行正常导入,如
import my_module
?
出现此问题的原因是,Vercel 在部署到无服务器环境时强制将 Python 模块构建为包。因此,为了符合 Python 的包结构要求,相对导入(例如,
from .my_module import some_function
)变得必要,但此类导入在本地开发服务器上的简单非包设置中会失败。
以下是如何配置代码以支持 Vercel 的要求 和 您的本地开发:
api
目录视为 Python 包您可以通过添加
api
文件来制作 __init__.py
包。
vercel.json
api/
├── __init__.py # This marks 'api' as a package
├── app.py
└── my_module.py
app.py
要使导入同时适用于本地开发和Vercel,请使用条件导入,如下所示:
app.py
try:
# For local development
from my_module import some_function
except ImportError:
# For Vercel deployment (package-relative import)
from .my_module import some_function
def handler(event, context):
return {"statusCode": 200, "body": "Hello, Vercel!"}
# Example function usage
if __name__ == "__main__":
print(some_function())
您当前的
vercel.json
看起来不错。只需确保以下设置:
{
"version": 2,
"builds": [
{
"src": "./api/app.py",
"use": "@vercel/python",
"config": {
"includeFiles": ["api/**"]
}
}
],
"routes": [
{ "src": "/(.*)", "dest": "/api/app.py" }
]
}
PYTHONPATH
要使用与 Vercel 类似的结构在本地运行项目,请将
api
的父目录包含在 PYTHONPATH
中:
在终端中运行:
export PYTHONPATH=.
python api/app.py
这会强制 Python 将
api
识别为包,从而使相对导入起作用。
作者:
__init__.py
文件添加到 api/
以将其标记为包。PYTHONPATH
。您可以使 Flask 应用程序在本地和 Vercel 上无缝运行,而无需进行重大代码修改。