一个脚本中写一个Web程序是不可取的,当项目变大时,会产生很多问题。虽然Flask项目没有固定的组织形式,不过,根据前人的经验,一般的项目建议取用如下的结构(如博客建站),当然如果自己很熟练的习惯或者有更好的方式,可以使用自己的习惯。
|-flasky
|-app/
|-templates/
|-static/
|-main/
|-__init__.py
|-errors.py
|-forms.py
|-views.py
|-__init__.py
|-email.py
|-models.py
|-migrations/
|-tests
|-__init__.py
|-test*.py
|-venv/
|-requirements.txt
|-config.py
|-manage.py
这种结构有4个顶级文件夹,Flask程序保存在名为app的包中,migrations文件夹数据库迁移脚本,单元测试写在tests包中,venv是python运行的虚拟环境。另外requirements.txt列出的是本虚拟环境所需要的包,方便在其他地方部署同样的环境,config.py是配置文件信息,manage.py是负责启动程序以及其他程序任务。
配置文件中,建议使用层次结构的配置类,而不是简单的字典状结构,而且,配置信息建议区分开发,测试和生产环境,各自使用不同的数据库,这样彼此不会干扰。这时通常会用到类继承,基类config包含通用配置,继承类分别定义专用配置。配置类可以定义init_app()类方法,参数是程序实列。敏感信息保存在环境变量,这样的配置灵活且安全。
这里补充说一下程序包,所谓程序包就是保存程序所有代码,模板,静态文件的文件夹,我们通常会称这个包为app(应用)。
单个文件开发程序虽然方便,但是缺点很明显,因为程序在全局作用域中创建,所以无法动态修改配置,运行脚本时,程序实例已经创建,再想修改配置就不可能了。这一点对于单元测试尤为重要。这个问题的解决方法就是延迟创建程序实例,把创建过程移到可显式调用的工厂函数中。这样不仅可以给脚本留出配置程序的时间,还能够创建多个程序实例。这么有用的工厂函数在app包的构造文件中定义。
关于工厂函数的定义以及使用蓝本等内容,明天再继续。敬请期待。
閱讀更多 文話教育 的文章