项目结构
Flask的一大优势就是其极其轻量化。但是也需要注意到,如果我们要用Flask做一个大项目的话,把所有代码写在一个文件里肯定是不合适的。非常难以维护。但是和Django这种框架又不一样,Flask并没有规定项目一定要遵从某种必须遵守的目录结构。最终,人们在长期的实践中得到一些比较好用因此约定俗成的目录结构。
一个典型的flask项目的目录结构是这样的(再次明确,不是强制的,而是约定俗成的一种结构):
这种结构有四个顶级文件夹,主体的程序代码都放在app包中;migrations文件夹中一般存放数据库迁移脚本;单元测试的编写放在tests目录中;venv文件夹包含了python的虚拟环境。
再来看下最外层的几个文件。config.py中包含了整个项目启动时需要知道的配置信息,debug等级(开发、测试还是生产等);manage.py用于启动程序以及其他程序任务。requirements.txt中记录了所有依赖包,这样可以便于让其他主机重新生成相同的虚拟环境。下面将一个个剖开分析:
■ 配置选项
把所有代码写在一个文件中的一个大坏处就是没有办法动态地进行配置。一旦程序开始跑了,就没有回头路了。为了区别不同环境下对程序不同的配置需求,在这里添加了一个config.py这个文件。虽然具体的配置管理也没有规定形式,但是这里介绍一种相比于用字典格式来进行管理更加高级的方式,用具有层级的配置类来管理。比如我们可以设计这样一个类:
importosclassConfig:
SECRET_KEY= os.getenv('SECRET_KEY') or 'some string'SQLALCHEMY_COMMIT_ON_TEARDOWN=True
@staticmethoddefinit_app(app):pass
classDevelopmentConfig(Config):'''开发环境配置'''DEBUG=True
SQLALCHEMY_DATABASE_URI= os.environ.get('DEV_DATABASE_URI')classTestingConfig(Config):'''测试环境配置'''TESTING=True
SQLALCHEMY_DATABASE_URI=xxxxclassProductionConfig(Config):
SQLALCHEMY_DATABASE_URI=xxx
config={'development':DevelopmentConfig,'testing':TestingConfig,'production':ProductionConfig,'default':DevelopmentConfig
}#用一个字典来统合地给出所有配置
Config基类中的静态方法init_app以程序实例为参数,这个方法后面还会再提