大型程序的结构(三)【程序包】重点!!!

本文详细介绍了Flask应用程序的结构,特别是程序包的组织方式,包括将templates和static文件夹移至app包下,以及数据库模型和邮件支持函数的放置。重点讨论了程序工厂函数的使用,解释了`init_app`方法在Flask扩展中的作用,以及如何在蓝本中实现程序功能。同时,提到了静态文件和模板文件的路径调整,以及蓝本的命名空间和端点名的规则。
摘要由CSDN通过智能技术生成

程序包用来保存程序的所有代码,模板和静态文件。
这个包直接称为app(应用),也可使用一个程序专用的名字。
templates和static文件夹是程序包的一部分,因此两个文件夹被移到app文件夹中。
数据库模型和电子邮件支持函数也被移到了这个包中,分别保存为app/models.py和app/email.py。

使用程序工厂函数

课外资料

Flask 扩展开发
自定义的flask扩展flask_sqlite3
扩展的代码flask_sqlite3.py如下:
下面是用来复制/粘贴的 flask_sqlite3.py 的内容:

import sqlite3
from flask import current_app

# Find the stack on which we want to store the database connection.
# Starting with Flask 0.9, the _app_ctx_stack is the correct one,
# before that we need to use the _request_ctx_stack.
try:
    from flask import _app_ctx_stack as stack
except ImportError:
    from flask import _request_ctx_stack as stack


class SQLite3(object):

    def __init__(self, app=None):
        self.app = app
        if app is not None:
            self.init_app(app)

    def init_app(self, app):
        app.config.setdefault('SQLITE3_DATABASE', ':memory:')
        # Use the newstyle teardown_appcontext if it's available,
        # otherwise fall back to the request context
        if hasattr(app, 'teardown_appcontext'):
            app.teardown_appcontext(self.teardown)
        else:
            app.teardown_request(self.teardown)

    def connect(self):
        return sqlite3.connect(current_app.config['SQLITE3_DATABASE'])

    def teardown(self, exception):
        ctx = stack.top
        if hasattr(ctx, 'sqlite3_db'):
            ctx.sqlite3_db.close()

    @property
    def connection(self):
        ctx = stack.top
        if ctx is not None:
            if not hasattr(ctx, 'sqlite3_db'):
                ctx.sqlite3_db = self.connect()
            return ctx.sqlite3_db

仔细看其中一段代码:

def __init__(self, app=None):
        self.app = app
        if app is not None:
            self.init_app(app)

__init__方法接受一个可选的应用对象,并且如果提供,会调用 init_app 。
init_app 方法使得 SQLite3 对象不需要应用对象就可以实例化。这个方法支持工厂模式来创建应用。 init_app 会为数据库设定配置,如果不提供配置,默认是一个内存中的数据库。此外, init_app 方法附加了 teardown 处理器。 它会试图使用新样式的应用上下文处理器,并且如果它不存在,退回到请求上下文处理器。

此外, init_app 方法用于支持创建应用的工厂模式:

db = Sqlite3()
# Then later on.
app = create_app('the-config.cfg')
db.init_app(app)


正文

flasky/app/_init_.py
构造文件

from flask import Flask
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_moment import Moment
from flask_sqlalchemy import SQLAlchemy
from config import config
###构造文件导入了大多数正在使用的Flask扩展。

bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()
###由于尚未初始化所需的程序实例app,所以没有初始化扩展,创建扩展类是没有向构造函数传入参数。

def create_app(config_name):
###create_app()函数就是程序的工厂函数,接受一个参数,是程序使用的配置名
    app = Flask(__name__)
    ###初始化Flask的程序实例app
    app.config.from_object(config[config_name])
    ###配置类在config.py文件中定义,其中保存的配置可以使用Flask app.config配置对象提供的from_object()方法直接导入程序。
    config[config_name].init_app(app)

    bootstrap.init_app(app)
    mail.init_app(app)
    moment.init_app(app)
    db.init_app(app)

    from .main import main as main_blueprint 
    ###从本级目录下的main文件夹中引入main作为main_blueprint蓝本
    app.register_blueprint(main_blueprint)
    ###main_blueprint蓝本注册到程序app上。
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值