使用蓝图(Blueprint)组织Flask应用




在一些重量级Web框架中(如Laravel/Django),框架中已经预置了整个框架的目录结构,在没有特殊需求的情况下通常不会改变它。在Flask这类轻量级框架中,理论上你可以把一个项目的全部代码都放进一个.py文件中。然而一旦项目规模稍大,就会变得庞大而难以管理。这时,我们需要蓝图(Blueprint)来帮助我们管理代码结构。

蓝图

什么是蓝图

Flask用蓝图(blueprints) 的概念来在一个应用中或跨应用制作应用组件和支持通用的模式。蓝图很好地简化了大型应用工作的方式,并提供给 Flask 扩展在应用上注册操作的核心方法。一个 Blueprint 对象与 Flask 应用对象的工作方式很像,但它确实不是一个应用,而是一个描述如何构建或扩展应用的蓝图 。

简而言之,我们可以将蓝图理解为Flask应用中的一个模块。

蓝图的用途:

  • 把一个应用分解为一个蓝图的集合,这可以用于组织大型的Flask应用。一个项目可以实例化一个应用对象,初始化几个扩展,并注册一集合的蓝图。
  • 在应用中通过URL前缀和/或子域名注册蓝图。 URL前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下)。
  • 在一个应用中用不同的 URL 规则多次注册一个蓝图。
  • 通过蓝图提供模板过滤器、静态文件、模板和其它功能。一个蓝图不一定要实现应用或者视图函数。
  • 初始化一个 Flask 扩展时,在这些情况中注册一个蓝图。

代码结构

这里我们仿照大多数MVC框架的结构来组织代码,即一个Controller文件作为一个蓝图。在如下的代码中,WebController.pyAPIController.py均为一个蓝图。

run.py
app/
    __init__.py
    controllers/
        __init__.py
        WebController.py
        APIController.py
    templates/
        index.html
        home.html

创建蓝图

#app/controllers/WebController.py
from flask import Blueprint

web = Blueprint('web', __name__)

@web.route("/web/sample")
def web_index():
    return render_template('index.html')
#app/controllers/APIController.py
from flask import Blueprint, jsonify

api = Blueprint('api', __name__)

@api.route("/api/sample")
def api_index():
    return jsonify("sample")

注册蓝图

#app/__init__.py
from flask import Flask, current_app, render_template, request

from .controllers.WebController import web_controller
from .controllers.APIController import api_controller

app = Flask(__name__, static_url_path='/static')  # 定义/static目录为静态文件目录

app.register_blueprint(web_controller)
app.register_blueprint(api_controller)

参考资料

http://flask.pocoo.org/docs/0.12/blueprints




Posted

in

by

Comments

One response to “使用蓝图(Blueprint)组织Flask应用”

  1. 知道91博客 Avatar

    不错啊,长见识了啊~

发表回复/Leave a Reply

您的电子邮箱地址不会被公开。/Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.