如何配置 vercel.json 以适应本地开发和 Flask 应用程序部署的远程实例中的模块导入?

问题描述 投票:0回答:1

我有一个非常基本的烧瓶应用程序,如下所示:

- 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

python-import vercel vercel-python vercel-flask
1个回答
0
投票

出现此问题的原因是,Vercel 在部署到无服务器环境时强制将 Python 模块构建为包。因此,为了符合 Python 的包结构要求,相对导入(例如,

from .my_module import some_function
)变得必要,但此类导入在本地开发服务器上的简单非包设置中会失败。

以下是如何配置代码以支持 Vercel 的要求 您的本地开发:


1。将您的
api
目录视为 Python 包

您可以通过添加

api
文件来制作
__init__.py
包。

  • 文件结构:
    vercel.json
    api/
    ├── __init__.py    # This marks 'api' as a package
    ├── app.py
    └── my_module.py
    

2。在
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())

3.调整 Vercel 配置

您当前的

vercel.json
看起来不错。只需确保以下设置:

  • vercel.json
    {
      "version": 2,
      "builds": [
        {
          "src": "./api/app.py",
          "use": "@vercel/python",
          "config": {
            "includeFiles": ["api/**"]
          }
        }
      ],
      "routes": [
        { "src": "/(.*)", "dest": "/api/app.py" }
      ]
    }
    

4。使用
PYTHONPATH

进行本地测试

要使用与 Vercel 类似的结构在本地运行项目,请将

api
的父目录包含在
PYTHONPATH
中:

在终端中运行:

export PYTHONPATH=.
python api/app.py

这会强制 Python 将

api
识别为包,从而使相对导入起作用。


总结

作者:

  1. __init__.py
    文件添加到
    api/
    以将其标记为包。
  2. 使用条件导入来处理这两种环境。
  3. 局部调整
    PYTHONPATH

您可以使 Flask 应用程序在本地和 Vercel 上无缝运行,而无需进行重大代码修改。

© www.soinside.com 2019 - 2024. All rights reserved.