我刚刚开始使用烧瓶,我遇到了麻烦。我正在尝试写一个小博客来习惯这个框架,所以我制作了两个包,一个“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我假设帖子应用程序没有运行。
有人可以帮忙吗?
答案 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()
仅用于开发 - 不是生产。