第七章 大型程序的结构
7.1项目结构
7.2配置选项
静态方法和类方法的区别
静态方法@staticmethod既不使用类,也不使用实例作为参数。
类方法@classmethod使用类cls而不是实例self作为第一个参数。
而不加前两个装饰器则为实例方法,使用self实例作为第一个参数。
7.3程序包
7.4启动脚本
7.5需求文件
7.6单元测试
在app/email.py
中,
#...
from . import mail
from flask import current_app
# ...
app = current_app._get_current_object()
其中的.不但包括app中的所有模块,
也包括init.py自身。
因为email.py已经不在app/__init__.py
中,
所以需要使用Flask的上下文current_app来获取实例。
还有一点需要注意的是,
config虽然不在app的目录下,
但是在app/__init__.py
中,
通过``from config import config导入了。
或者通过current_app.config来获取配置。
7.7创建数据库
7.8其他疑问
a.py如何导入b.py,
如果b.py所在目录没有__init__
,
并且b.py和a.py的父目录在同一目录下?
使用.和..相对导入语法,
必须先定义父目录包。
为了让python将文件夹当作包,
它必须包含一个命名为__init__.py
的文件。
导入后,包中的类、全局变量、函数都可以使用。
app.config.from_object可以从目标导入配置。
在互相导入的两个模块中,
会造成循环导入,
这时应该把其中一个导入语句放到最后,
或者放在较小模块的函数中。