6

我刚刚开始使用烧瓶,但遇到了一个障碍。我正在尝试写一个小博客来习惯这个框架,所以我做了两个包,一个“auth”和“posts”。我通读了Flask 文档中的大型应用程序部分。

我的目录看起来像这样。

>/root
>>run.py 

>>/posts

>>>____init____.py  
>>>views.py  
>>>/templates
>>>/static  

>>/auth  
>>>____init____.py  
>>>views.py  
>>>/templates
>>>/static

run.py 看起来像这样:

from flask import Flask
from auth import auth_app
from posts import posts_app

auth_app.run()
posts_app.run()

/posts/__init__.py/auth/__init__.py看起来像这样:

from flask import Flask

auth_app = Flask(__name__)

import auth.views

view.py 看起来像这样:

from auth import auth_app

@auth_app.route('/auth/')
def index():
    return "hello auth!"

但是每当我运行服务器时,只有 localhost/auth/ 可用,其他所有内容都会给出 404,所以我假设帖子应用程序没有运行。

任何人都可以帮忙吗?

4

2 回答 2

6

您的 auth_app.run() 方法会阻止您的程序继续运行。这就是 posts_apps 应用程序无法运行的原因。提供页面的整个过程发生在 Flask 的 run() 方法中。因此,您可以得出结论,您不能在同一进程中运行两个 Flask 应用程序。

如果您希望像这样将应用程序分成两部分,推荐的方法是使用blueprints。您无需创建两个应用程序(身份验证和帖子),而是创建两个蓝图。然后你像这样创建一个应用程序......

from flask import Flask
from auth import auth_blueprint
from posts import post_blueprint

app = Flask(__name__)
app.register_blueprint(auth_blueprint)
app.register_blueprint(post_blueprint)
app.run()
于 2012-06-21T15:55:17.370 回答
6

尽管 Mark 使用蓝图的方法似乎很适合您的项目,但如果您想为每个包使用单独的应用程序,您应该研究werkzeug.wsgi.DispatcherMiddleware.

运行第一个应用程序后,单个进程无法运行第二个应用程序(就像您的问题一样),但这不是 DispatcherMiddleware 的问题。您可以使用它来定义主应用程序以及基于 URL 前缀的其他应用程序。

文档上的示例区分了两个应用程序——前端和后端——它们的运行取决于用户请求的 URL。

如果您想了解更多信息,请阅读 Matt Wright 的“我如何构建我的 Flask 应用程序”并查看他的示例项目Overholt。他决定使用两个应用程序:一个用于主网站(前端),另一个用于 API,他根据 URL 前缀创建了两者之间的区别。从他的代码*:

    从 werkzeug.serving 导入 run_simple
    从 werkzeug.wsgi 导入 DispatcherMiddleware
    从overholt导入api,前端


    应用程序 = DispatcherMiddleware(frontend.create_app(), {
        '/api': api.create_app()
    })


    如果 __name__ == "__main__":
        run_simple('0.0.0.0', 5000, 应用程序, use_reloader=True, use_debugger=True)

这样,他创建了两个应用程序,其中每个应用程序都有其定义的视图、配置等集合,并且能够从同一个 Python 解释器进程运行它们。

*请注意,这run_simple()仅用于开发——而非生产。

于 2014-12-29T22:37:22.307 回答