Flask:在一个应用程序中使用多个包

时间:2012-06-21 15:37:53

标签: python routing blogs packages flask

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

我的目录看起来像这样。

>/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

并且views.py看起来像这样:

from auth import auth_app

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

但每当我运行服务器时,只有localhost / auth /可用,而其他所有内容都提供了404,som我假设帖子应用程序没有运行。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:5)

您的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()

答案 1 :(得分:4)

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

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

文档上的示例区分了两个应用程序 - frontend和backend--它们根据用户请求的URL运行。

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

    from werkzeug.serving import run_simple
    from werkzeug.wsgi import DispatcherMiddleware
    from overholt import api, frontend


    application = DispatcherMiddleware(frontend.create_app(), {
        '/api': api.create_app()
    })


    if __name__ == "__main__":
        run_simple('0.0.0.0', 5000, application, use_reloader=True, use_debugger=True)

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

*请注意,run_simple()仅用于开发 - 不是生产。