带有“子模块”的 Flask 应用程序

Luc*_*ild 4 python packages flask

我正在尝试开发具有不同“子模块”的 API。例如,有一个叫做 todo,另一个叫做 newsletter。

我想要做的是,我希望能够在开发过程中自己运行模块,并且我希望能够在服务器上运行带有它的子模块的整个 API。

我当前的文件夹结构看起来像这样

api
  - api
    - todo
      - todo
        - __init__.py
        - routes.py
        - utils.py
        - ...
      - README.md
      - requirements.txt
    - newsletter
      - ...
  - run.py
Run Code Online (Sandbox Code Playgroud)

目的是能够在开发过程中运行它:

cd api/todo/todo
python3 run.py
Run Code Online (Sandbox Code Playgroud)

这在服务器上

python3 run.py
Run Code Online (Sandbox Code Playgroud)

路线应该是相对的:

在生产过程中,一个子模块的路径应该是这样的

/add
Run Code Online (Sandbox Code Playgroud)

但是在服务器上,它们应该始终包含子模块的名称

/todo/add
Run Code Online (Sandbox Code Playgroud)

此外,我希望能够将每个子模块的代码放在一个 GitHub 存储库中,以便其他人能够自己运行它们。

我目前坚持导入模块。我可以解决路径问题使用 Flasks 蓝图吗?

我非常感谢任何帮助!

sta*_*mer 7

您可以使用以下项目结构:

app
    api
        -todo
            -__init__.py
            -other_apis.py
        -newsletter
            -__init__.py
            -other_apis.py
    __init__.py
Run Code Online (Sandbox Code Playgroud)

app.api.todo.__init__.py

from flask import Blueprint

todo = Blueprint("todo", __name__)
Run Code Online (Sandbox Code Playgroud)

app.api.newsletter.__init__.py

from flask import Blueprint

newsletter = Blueprint("newsletter", __name__)
Run Code Online (Sandbox Code Playgroud)

app.__init__.py

from flask import FLask

app = Flask(__name__)

from app.api.todo import todo
from app.api.newsletter import newsletter

app.register_blueprint(todo, url_prefix="/api/todo")
app.register_blueprint(newsletter, url_prefix="/api/newsletter")

if __name__ == "__main__":

    app.run()
Run Code Online (Sandbox Code Playgroud)

您可以使用环境变量更改注册的蓝图以及绑定到蓝图的 url 前缀。