flask:如何构建多个应用的项目架构?

22 投票
2 回答
23982 浏览
提问于 2025-04-17 20:02

假设我想要建立一个像Facebook这样的项目。

我需要一个这样的项目结构:

facebook/
         __init__.py
         feed/
             __init__.py
             models.py
             business.py
             views.py
         chat/
             __init__.py
             models.py
             business.py
             views.py
         games/
             __init__.py
             models.py
             business.py
             views.py
         common/
             common.py

         runserver.py

我该如何合理地组织这个结构,以便当我运行时:

python facebook/runserver.py

它能从我所有的应用中加载视图?
我想保持这个结构,因为这样扩展项目会更自然。

我正在尝试遵循他们的建议,但我不太明白我需要在哪里写:

from flask import Flask

app = Flask(__name__)

以及如何在一个地方导入所有应用的视图,请帮帮我。

如果我在facebook/__init__.py中写了上面的代码,那么在facebook/feed/views.py中,我该如何做:

from facebook import app

2 个回答

23

使用蓝图。你每个子应用都应该是一个蓝图,然后把它们都加载到你的主初始化文件里。

关于你第二个问题的回答

from flask import Flask
app = Flask(__name__)

你应该把这个放到facebook/__init__.py里。

顺便说一下,我的runserver.pysettings.py文件总是放在facebook/文件夹的下一层。

像这样:

facebook/
         __init__.py
         feed/
             __init__.py
             models.py
             business.py
             views.py
         chat/
             __init__.py
             models.py
             business.py
             views.py
         games/
             __init__.py
             models.py
             business.py
             views.py
         common/
             common.py

runserver.py
settings.py

runserver.py的内容:

from facebook import app
app.run()

我想settings.py的内容就不需要解释了。

facebook/__init__.py的内容:

from flask import Flask
app = Flask(__name__)
app.config.from_object('settings')
from blog.views import blog #blog is blueprint, I prefer to init them inside views.py file
app.register_blueprint(blog,url_prefix="/blog")
20

我尝试过蓝图(blueprints),找到了一个对我有效的解决方案。如果你有其他想法,欢迎告诉我。

项目结构

facebook/
        runserver.py
        feed/
            __init__.py
            views.py
        chat/
            __init__.py
            views.py

代码

# create blueprint in feed/__init__.py
from flask import Blueprint

feed = Blueprint('feed', __name__)
import views

# create blueprint in chat/__init__.py
from flask import Blueprint

chat = Blueprint('chat', __name__)
import views

# add views (endpoints) in feed/views.py
from . import feed

@feed.route('/feed')
def feed():
    return 'feed'

# add views (endpoints) in chat/views.py
from . import chat

@chat.route('/chat')
def chat():
    return 'chat'

# register blueprint and start flask app
from flask import Flask
from feed import feed
from chat import chat

app = Flask(__name__)
app.register_blueprint(feed)
app.register_blueprint(chat)
app.run(debug=True)

实际效果

 * Running on http://127.0.0.1:5000/
# Hit Urls
http://127.0.0.1:5000/feed # output feed
http://127.0.0.1:5000/chat # output chat

撰写回答