配置

pyape.toml

pyape.toml 是 pyape 框架的主配置文件。它应该跟随项目源码一起被提交到 VCS。

一个框架需要大量的配置文件,pyape 也不例外。 由于 TOML 格式的特点,我们可以把所有的配置文件的生成和替换在一个单独的文件中完成,这让我们的配置更容易理解。 感谢 TOML。

关于 TOML 格式的介绍请阅读: https://toml.io/

替换机制

pyape 在生成配置文件的时候,会读取 pyape.toml 的所有内容, 根据其中的配置做好值的替换,再写入到具体的配置文件中。

pyape 有两个主要的替换机制。

任何时候都可用的变量

NAME/DEPLOY_DIR/WORK_DIR 这三个变量在任何时候都可用。关于前两个, 需要在 根元素 中进行定义。

WORK_DIR 不需要定义就能使用,它指向 pyape 项目的工作文件夹。

从环境变量中获取值

为了安全,我们会把敏感的信息写入系统的环境变量中。pyape 可以从环境变量中提取致,在生成配置文件时进行替换。

请阅读 根元素 中关于 REPLACE_ENVIRON 的介绍。

多开发环境支持

Web 程序开发的过程中,我们一般会有多套开发环境。例如在本地 local 环境做调试, 在远程测试 test 服务器做测试,在正式服 prod 环境做部署。

pyape 的多开发环境支持,可以支持在 pyape.toml 中进行多套环境的配置。默认配置会被环境配置中的同名变量直接覆盖。 这种机制减少了配置内容的数量,也方便信息共用。

环境配置以 ENV.环境名 开头,后接希望被覆盖的配置名称。

例如,根元素下的 DEPLOY_DIR 配置,若希望在 prod 环境中使用不同的值,可以增加这样的配置:

[ENV.prod]
DEPLOY_DIR = '/srv/app/{{NAME}}_prod'

若希望在 local 环境中使用调试方式启动 Flask,则可以覆盖默认的 FLASK_ENV

[ENV.local.'.env']
FLASK_ENV = 'development'
FLASK_RUN_PORT = 5001

在开发环境配置中提供的配置,将被 合并 进入默认的配置。 合并规则如下:

  • 开发环境配置会 覆盖 默认配置中的同名参数。

  • 开发环境中的新配置,会 增加 到默认配置中。

  • 若希望在开发环境中 删除 某个默认配置,可以将开发环境中的同名变量设置为空值。

备注

由于 TOML 自身的规则 限制,TOML 配置中是没有 空值 的概念的。 若希望将某个值设置为空值,可以使用布尔值或者空对象的方法。

下面是几个关于开发环境替换的例子:

# 正式环境的 uwsgi 使用 4 进程启动
[ENV.prod.'uwsgi.ini']
processes = 4

# 正式环境的数据库使用 DEPLOY_DIR 来定位
[ENV.prod.'config.toml'.SQLALCHEMY]
URI = 'sqlite:///{{DEPLOY_DIR}}/pyape.sqlite'

# 正式环境的 gunicorn 使用 sock 绑定,并指定 pid 和 log 文件
[ENV.prod.'gunicorn.conf.py']
bind = 'unix:{{DEPLOY_DIR}}/gunicorn.sock'
pidfile = '{{DEPLOY_DIR}}/gunicorn.pid'
accesslog = '{{DEPLOY_DIR}}/logs/access.log'
errorlog = '{{DEPLOY_DIR}}/logs/error.log

根元素

PYE

远程服务器专用。定义 Python 运行时路径,可使用绝对路径。这个配置仅在部署远程服务器时有意义, 指定的是远程服务器上的 Python 运行时。使用 pyape venv 命令部署远程虚拟环境时, 会使用这里定义的 Python 运行时。

NAME

项目名称。 可以用做替换值。 配置文件中所有包含 {{NAME}} 的参数都会被这里的值替换。

DEPLOY_DIR

远程服务器专用。设定部署在服务器上的文件夹。 可以用做替换值。 配置文件中所有包含 {{DEPLOY_DIR}} 的参数都会被这里的值替换。

RSYNC_EXCLUDE

远程服务器专用。这是一个列表,定义在使用 pyape deploy 命令将本地代码同步到远程服务器时的排除文件。 详情可参考 fabric-patchwork.transfers

REPLACE_ENVIRON

这是一个列表。定义允许被替换的环境变量的名称。 若配置文件中包含下面的名称,并使用 {{}} 包裹,则会被替换成环境变量中的值。

例如:

  1. 项目 NAME 为 pyape,作为环境变量替换时,会被转换为全大写 PYAPE

  2. 环境变量中包含 PYAPE_LOCAL_SECRET_KEY

  3. 使用 --env local 生成配置文件时,将替换 {{SECRET_KEY}} 的值为环境变量中的 PYAPE_LOCAL_SECRET_KEY

默认提供了四个环境变量替换:

  • {{ADMIN_NAME}} 管理员帐号

  • {{ADMIN_PASSWORD}} 管理员密码

  • {{SECRET_KEY}} flask 框架加密使用

  • {{SQLALCHEMY_URI}} 数据库地址和密码定义

亦可自行增加环境变量,保证配置文件中的变量名称相同即可。

[FABRIC]

pyape 使用 Fabric 作为部署工具。在部署时,会直接读取这个段落的配置作为 Fabric 调用的参数。

警告

强烈建议在本地 ~/.ssh/config 中配置好 host 地址、端口和公钥。 此处的 host 可以使用配置好的地址,避免真实的地址提交到版本库造成信息泄露。

host

远程服务器地址。

user

远程服务器登录用户。

[‘.env’]

.env 是一个配置文件,在使用 pyape config 生成配置文件, 或使用 pyape deploy 进行远程部署时,会自动生成。

其内容为 FLASK 运行需要的配置。默认值为:

FLASK_APP = 'wsgi:{{NAME}}_app'
FLASK_ENV = 'production'
FLASK_RUN_PORT = 500

请参考 Flask 官方文档中的 dotenv 部分了解此处的配置。

pyape 会调用 flask.cli.load_env.env 文件载入为环境变量。

[‘gunicorn.conf.py’]

gunicorn.conf.pyGunicorn 的配置文件。

默认值为:

wsgi_app = 'wsgi:{{NAME}}_app'
proc_name = '{{NAME}}'
bind = '127.0.0.1:5001'
umask = 0
daemon = true
capture_output = true

配置中可用的参数,通过阅读 pyape.tpl.gunicorn.conf.py.jinja2 源码获取。

[‘uwsgi.ini’]

uwsgi.iniuWSGI 的配置文件。

默认值为:

callable = 'wsgi:{{NAME}}_app'
processes = 2
threads = 1
venv = '%dvenv'
# 是否切换到后台,本地调试的时候可以设为 False,直接查看控制台输出
daemonize = true
# socket 和 http 参数二选一,如果同时选择,以 socket 参数为准
# 端口转发可能引发 nginx 499 问题(推测是端口转发 limit 没有打开)
# 改为使用 sock 文件 (同样需要打开 limit 限制)
socket = '%d%n.sock'
# http_socket = '127.0.0.1:5002'
# http = '127.0.0.1:5002'
# Stat Server
stats = '%d%nstats.sock

配置中可用的参数,通过阅读 pyape.tpl.uwsgi.ini.jinja2 源码获取。

[‘config.toml’]

config.toml 是 pyape 框架在作为 Web App 运行时使用的配置文件。 数据库定义、endpoint 支持等均在此定义。

[‘config.toml’.FLASK]

定义 flask 框架使用的变量,默认值为:

SECRET_KEY = '{{SECRET_KEY}}'

定义在这里的变量会进入 flask.config

[‘config.toml’.SQLALCHEMY]

定义数据库,默认值为:

# 单数据库地址配置, {{WORK_DIR}} 被替换为 pyape 运行文件夹的绝对路径
['config.toml'.SQLALCHEMY]
URI = 'sqlite:///{{WORK_DIR}}/pyape.sqlite

配置数据库的引擎参数:

# 单数据库配置数据库引擎参数
['config.toml'.SQLALCHEMY.ENGINE_OPTIONS]
pool_timeout = 10
pool_recycle = 360

URI 也可以作为多数据库存在:

['config.toml'.SQLALCHEMY.URI]
test1000 = 'mysql+pymysql://test:123456@127.0.0.1/test1000'
test2000 = 'mysql+pymysql://test:123456@127.0.0.1/test2000

配置 test1000 这个数据库的引擎参数:

['config.toml'.SQLALCHEMY.ENGINE_OPTIONS.test1000]
pool_timeout = 10
pool_recycle = 360

[‘config.toml’.REDIS]

REDIS 的配置与 SQLALCHEMY 拥有完全相同的规则。

单个 REDIS 数据库:

['config.toml'.REDIS]
URI = 'redis://localhost:6379/0'

多 REDIS 配置,与单个 REDIS 地址配置方式二选一:

['config.toml'.REDIS.URI]
# 对 REDIS 的使用遵循了最大利用率+最大灵活性原则,可能出现:
# 1. 单个 Regional 使用单个 REDIS 实例(少量情况)
# 2. 多个 Regional 使用同一个 REDIS 实例,分 DB 存储(多数情况)
# 3. 多个 Regional 使用同一个 REDIS 实例和同一个 DB(测试情况)
# 4. 单个 Regional 使用多个 REDIS 实例(暂未如此部署)
db0 = 'redis://localhost:6379/0'
db1 = 'redis://localhost:6379/1'

[‘config.toml’.PATH]

配置 Flask 对象创建时的三个路径参数,例如:

STATIC_URL_PATH = '/static'
TEMPLATE_FOLDER = 'client/dist/template'
STATIC_FOLDER = 'client/dist/static'

详情参见 flask.Flask 的参数。

[‘config.toml’.PATH.modules]

pyape 会自动根据这个配置下的名称导入项目文件夹 app 下的模块,每个模块作为一个 Blueprint 存在。

在下面的配置中, main 这个模块对应的 endpoint 为 ‘/’, user 这个模块对应的 endpoint 为 ‘/user’:

main = ''
user = '/user'
oauth = '/oauth

关于使用 pyape 开发 Web 项目的更多信息,请参见: 开发