» Python:使用Flask构建REST API » 2. 开发 » 2.7 配置文件

Config File

c = Config(
    ApplicationConfig(
        5000
    ),
    DBConfig(
        "test.db",
        "127.0.0.1",
        3306,
        "test_user",
        "test_pass",
        "lr_book"
    )
)

你可能已经注意到了,硬编码的配置项是潜在的安全漏洞。而且一旦编译部署后,开发人员也很难改动控制它。

所以,你需要一个单独的配置文件。

添加 config.yml:

app:
  port: 5000
db:
  file_name: "test.db"
  host: "127.0.0.1"
  port: 3306
  user: "test_user"
  password: "test_pass"
  database: "lr_book"

添加 yaml 依赖:

pip3 install pyyaml

更新 requirements.txt:

pip3 freeze > requirements.txt 

添加 parseConfig 函数,infrastructure/config/config.py:

@@ -1,4 +1,5 @@
 from dataclasses import dataclass
+import yaml
 
 
 @dataclass
@@ -20,3 +21,12 @@ class ApplicationConfig:
 class Config:
     app: ApplicationConfig
     db: DBConfig
+
+
+def parseConfig(filename: str) -> Config:
+    with open(filename, 'r') as f:
+        data = yaml.safe_load(f)
+        return Config(
+            ApplicationConfig(**data['app']),
+            DBConfig(**data['db'])
+        )

使用 parseConfigmain.py:

@@ -2,21 +2,11 @@ from flask import Flask
 
 from books.adapter.router import make_router
 from books.application import WireHelper
-from books.infrastructure.config import Config, ApplicationConfig, DBConfig
+from books.infrastructure.config import Config, ApplicationConfig, DBConfig, parseConfig
 
-c = Config(
-    ApplicationConfig(
-        8080
-    ),
-    DBConfig(
-        "test.db",
-        "127.0.0.1",
-        3306,
-        "test_user",
-        "test_pass",
-        "lr_book"
-    )
-)
+CONFIG_FILENAME = "config.yml"
+
+c = parseConfig(CONFIG_FILENAME)
 wire_helper = WireHelper.new(c)
 app = Flask(__name__)
 make_router(app, wire_helper)

硬编码的配置项被移到了 config.yml 中。不错!

警醒: 不要直接 git 提交 config.yaml。可能会导致敏感数据泄露。如果非要提交的话,建议只提交配置格式模板。
比如:

app:
  port: 5000
db:
  file_name: ""
  host: ""
  ...