Flask Web开发 7.0 大型程序的结构

尽管在单一脚本中编写小型Web程序很方便,但这种方法并不能广泛使用。程序变复杂后,使用单个大型源码文件会导致很多问题。
不同于大多数其他Web框架,Flask并不强制要求大型项目使用特定的组织方式,程序结构的组织方式完全由开发者决定。本章将会介绍一种使用包和模块组织大型程序的方式。本书后续示例都会采用这种结构。

7.1 项目结构

Flask程序的基本结构:

| -flasky
  | -app/
    | -templates/
    | -static/
    | -main/
      | -__init__.py
      | -errors.py
      | -forms.py
      | -views.py
    | -__init__.py
    | -email.py
    | -models.py
  | -migrations.py
  | -tests/
    | -__init__.py
    | -test.py
  | -venv
  | -requirements.txt
  | -config.py
  | -manage.py
这种结构有四个顶级文件夹:

  • Flask程序一般都保存在名为app的包中
  • 和之前一样,migrations文件夹包含数据库迁移脚本
  • 单元测试编写在tests包中
  • 和之前一样,venv文件夹包含Python虚拟环境
同时还创建了一些新文件:
  • requirements.txt列出了所有依赖包,便于在其他电脑中重新生成相同的虚拟环境
  • config.py存储配置
  • manage.py用于启动程序以及其他的程序任务
下面几节讲解把目前为止我们的略显规模的hello.py程序转换为这种结构的过程。

7.2 配置选项

程序经常需要设定多个配置。这方面最好的例子就是开发、测试和生产环境要使用不同的数据库,这样才不会彼此影响。
我们不再使用 hello.py 中简单的字典状结构配置,而使用层次结构的配置类。config.py 文件的内容如示例 7-2 所示。
import os 
basedir = os.path.abspath(os.path.dirname(__file__)) 
 
class Config: 
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string' 
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True 
    FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]' 
    FLASKY_MAIL_SENDER = 'Flasky Admin <flasky@example.com>' 
    FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN') 
 
    @staticmethod 
    def init_app(app): 
        pass 
 
class DevelopmentConfig(Config): 
    DEBUG = True 
    MAIL_SERVER = 'smtp.googlemail.com'
    MAIL_PORT = 587 
    MAIL_USE_TLS = True 
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME') 
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') 
    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:///' + os.path.join(basedir, 'data-test.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中包含通用配置,子类分别定义专用的配置。如果需要,你还可添加其他配置类。
为了让配置方式更灵活且更安全,某些配置可以从环境变量中导入。例如,SECRET_KEY的值,这是个敏感信息,可以在环境中设定,但系统也提供了一个默认值,以防环境中没有定义。在3个子类中,SQLALCHEMY_DATABASE_URI 变量都被指定了不同的值。这样程序就可在不同的配置环境中运行,每个环境都使用不同的数据库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值