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

Jer*_*cer 6 python routing blogs packages flask

我刚刚开始使用烧瓶,我遇到了麻烦.我正在尝试写一个小博客来习惯这个框架,所以我制作了两个包,一个"auth"和"posts".我通读了Flask文档中的Large Applications部分.

我的目录看起来像这样.

>/root
>>run.py 

>>/posts

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

>>/auth  
>>>____init____.py  
>>>views.py  
>>>/templates
>>>/static
Run Code Online (Sandbox Code Playgroud)

run.py看起来像这样:

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

auth_app.run()
posts_app.run()
Run Code Online (Sandbox Code Playgroud)

/posts/__init__.py/auth/__init__.py像这样:

from flask import Flask

auth_app = Flask(__name__)

import auth.views
Run Code Online (Sandbox Code Playgroud)

和views.py看起来像这样:

from auth import auth_app

@auth_app.route('/auth/')
def index():
    return "hello auth!"
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮忙吗?

Mar*_*eth 5

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

如果您希望将应用程序拆分为两个,建议的方法是使用蓝图.您可以创建两个蓝图,而不是创建两个应用程序(身份验证和帖子).然后你创建一个这样的应用程序......

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()
Run Code Online (Sandbox Code Playgroud)


ara*_*lar 5

尽管看上去Mark的使用蓝图的方法很适合您的项目,但是如果您想对每个软件包使用单独的应用程序,则应该研究werkzeug.wsgi.DispatcherMiddleware

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

文档上的示例区分了两个应用程序(前端和后端),它们根据用户请求的URL运行。

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

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


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


    如果__name__ ==“ __main__”:
        run_simple('0.0.0.0',5000,application,use_reloader = True,use_debugger = True)

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

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