网站的建设与维护实践报告网站开发的研究现状
代码与环境配置解耦
git分支的代码应做到“环境无关”:代码本身不硬编码任何环境特定的配置(如数据库连接、密钥、API地址),而是通过外部机制动态注入。
配置与代码分离:将配置信息存储在代码库之外(如环境变量、独立配置文件、密钥管理服务),避免提交到 Git 仓库。
 环境变量/配置文件 随便用,对内存的影响完全可以忽略不记 
 
案例:典型 Web 应用的配置 
 
- 环境变量:约 10 个变量(如数据库 URL、API 密钥、调试模式),总大小约 1KB。
 - 配置文件:一个 500 行的 JSON 文件(约 5KB),解析后内存占用约 10-20KB。
 - 总内存影响:不到 50KB,远低于一个简单 Python 对象(如空列表占用 40KB)。
 
对于YAML和TOML的选择来说,我更倾向于TOML,主要是TOML对缩进及空格数量不敏感,YAML的缩进和横杠-真烦啊!
各种配置文件的优缺点对比
| 配置格式 | 语法复杂度 | 结构化数据支持 | 注释支持 | 数据类型支持 | 适用场景 | 解析库 | 
|---|---|---|---|---|---|---|
.ini | 低 | 差(仅支持键值对) | 是 | 否(所有值为字符串) | 小型应用 | configparser | 
settings.py | 低 | 强(Python 代码) | 是 | 强 | Django/Python 项目 | Python 直接解析 | 
.env | 低 | 差(仅键值对) | 是 | 否(所有值为字符串) | 12 Factor App | python-dotenv | 
json | 中 | 强(嵌套支持) | 否 | 强 | Web 开发、API | json | 
yaml | 中 | 强(嵌套支持) | 是 | 强 | DevOps、Kubernetes | PyYAML | 
toml | 低 | 强(嵌套支持) | 是 | 强 | Python/Rust 配置 | toml | 
选择合适的配置文件
- Web 开发/Django → 
settings.py - 存储环境变量/API 密钥 → 
.env - 前后端通用配置、API 交互 → 
json - DevOps/Kubernetes → 
yaml - Python、Rust 工程配置 → 
toml - 小型桌面应用、简单配置 → 
.ini 
在 Web 应用中,使用数据库存储用户配置(如用户偏好、通知设置、API 密钥等)是一种常见的方法。与 .env、配置文件或环境变量相比,数据库存储具有更强的可管理性,但也存在一定的性能和安全性问题。下面是数据库存储用户配置的优缺点分析及实现方式。
Python 代码(Django ORM):
from django.db import modelsclass UserSettings(models.Model):user = models.OneToOneField("auth.User", on_delete=models.CASCADE)theme = models.CharField(max_length=50, default="light")notifications = models.BooleanField(default=True)language = models.CharField(max_length=10, default="en")updated_at = models.DateTimeField(auto_now=True)
 
查询用户配置:
settings = UserSettings.objects.get(user=request.user)
print(settings.theme)  # "light"
 
 
应用程序修改自身配置并保留注释
通常情况下,配置文件(如 .ini, .env, .yaml, .toml, .json)主要用于存储应用的静态配置,而应用程序一般只读取配置。但在某些特定场景下,应用程序允许修改自身的配置文件。
| 配置格式 | 只读解析库 | 解决方案(修改保存) | 
|---|---|---|
.ini | configparser | 使用 ConfigObj | 
.env | dotenv_values | 手动读取/合并 | 
.yaml | PyYAML | 使用 ruamel.yaml | 
.toml | toml | 使用 tomlkit | 
.json | json | 使用 commentjson | 
from configobj import ConfigObjconfig = ConfigObj("config.ini", encoding="utf-8")# 修改配置
config["settings"]["theme"] = "dark"# 保存时会保留注释
config.write()
 
 
from tomlkit import parsewith open("config.toml", "r") as f:toml_data = parse(f.read())# 修改配置
toml_data["app"]["debug"] = False# 保存 (保留注释)
with open("config.toml", "w") as f:f.write(toml_data.as_string())
 
