flask web开发(四)--大型程序的结构

|-flasky
	|-app/ #四个顶级文件夹之一,flask程序保存在这个里面
		|-templates/
		|-static/
		|-main/
			|-__init__.py
			|-errors.py
			|-forms.py
			|-views.py #这是程序的路由
		|__init__.py
		|-email.py
		|-models.py #数据库模型
	|-migrations/ #四个顶级文件夹之一,包含数据库迁移脚本
	|-tests/ #四个顶级文件夹之一,单元测试编写在这个包中
		|-__init__.py
		|-test*.py
	|-venv/ #四个顶级文件夹之一,包含python flask的虚拟环境
	|-requirements.txt #列出了所有依赖包,其他电脑中能生成相同的虚拟环境
	|-config.py #存储了配置信息
	|-manage.py #用于启动程序和其他的程序任务,这个脚本先创建程序,然后定义了配置


配置选项 config.py

在大型的程序结构里面,我们不像在单一脚本中使用简单的字典状结构配置,而是使用层次结构的配置类:

import os
basedir = os.path.abspath(os.path.dirname(__file__))

class Config:   #这是基类,包含了通用设置
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME') #这里不像单一脚本里面使用app.config['MAIL_USERNAME']=...这样的字典结构
    ...
    @staticmethod
    def init_app(app):  #这个的参数是程序实例,在这个方法中,可以执行对当前环境的配置初始化。
        pass
class DevelopmentConfig(Config): #三个子类之一
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')
class TestingConfig(Config):  #三个子类之一
    TESTING = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
        'sqlite://'
class ProductionConfig(Config):  #三个子类之一
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data.sqlite')

config = {        #为四种模式分别指定一个配置类
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}

基类config包含了通用的配置,子类分别定义了专用的配置,还可以继续添加其他的配置类。
在上面设置的三个子类中,SQLALCHEMY_DATABASE_URI 变量分别制定了不同的值,这样的目的是在每个环境中使用不同的数据库。



app文件夹中 __init__.py 是程序包的构造文件

构造文件导入大多数正在使用的flask拓展,里面主要是放置:

from flask_sqlalchemy import SQLAlchemy  #引入拓展
app = Flask(__name__)
app.config.from_object('app.config.DevelopmentConfig') #引入配置
db = SQLAlchemy(app)

我们学习使用工厂函数,延迟创建程序实例,把创建过程移到可显式调用的工厂函数中,这种方法不仅可以给脚本留出配置程序的时间,还能够创建多个程序实例。

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

bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()


def create_app(config_name): #程序的工厂函数,一个参数,程序使用的配置名
    app = Flask(__name__)
    app.config.from_object(config[config_name]) #使用配置对象提供的方法直接从配置文件里面导入配置
    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
    app.register_blueprint(main_blueprint)   #蓝本

    return app

在蓝本中实现程序的功能:
上面代码的注释中可以看到蓝本,现在程序在运行的时候才会创建,运行之后再使用app.route()定义路由就太晚了,所以使用蓝本
蓝本和程序类似,可以定义路由,但是在蓝本中定义路由是休眠状态,直到蓝本注册到程序上,路由才会真正生效。
创建蓝本的方法:

from flask import Blueprint
main = Blueprint('main', __name__)  #实例化一个蓝本对象可以创建蓝本
#第一个参数是蓝本的名字,所以这个蓝本叫做main
#第二个参数是蓝本所在的包或者模块,大多数情况下使用__name__
from . import views, errors #view.py中保存的是路由,所以这样就把路由和蓝本关联了起来

蓝本已经创建完毕,但是还需要将蓝本注册到程序上:
app.regisiter_blueprint(main_blueprint)



需求文件: requirements.txt

用于记录所有依赖包以及其精确的版本号
pip可以自动生成这个文件:
pip freeze >requirements.txt
如果要创建这个虚拟环境的完全副本,可以安装文件内的依赖包创建一个新的虚拟环境:
pip install -r requirements.txt

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值