【问题标题】:PyYAML - Skipping certain keys when dumping a dict to filePyYAML - 将字典转储到文件时跳过某些键
【发布时间】:2020-06-30 11:35:18
【问题描述】:

我有一个 YAML 文件,其中包含我的应用程序的配置数据,每当应用程序运行以进行调试时,该文件都会转储到一个新文件中。不幸的是,YAML 文件中的某些键包含敏感数据,需要进行混淆处理或从转储文件中简单地排除。

示例 YAML 输入文件:

logging_config:
    level: INFO
    file_path: /path/to/log_file.log
database_access:
    table_to_query: customer_table
    database_api_key: XXX-XXX-XXX  # Sensitive data, exclude from archived file

当然有解决方法:

  • 在将密钥输出到 YAML 之前保留包含敏感数据和预处理 dicts 的密钥列表
  • 在单独的配置文件中分离敏感和非敏感数据并仅输出后者

但我希望有一个类似于实现自定义 Loader 的解决方案,只要它出现在 dict 值中,它就会对 !keep_secret 之类的命令做出反应,因为它会使我的配置文件更具可读性。

【问题讨论】:

    标签: python yaml pyyaml


    【解决方案1】:

    您可以使用自定义代表。这是一个基本示例:

    import yaml
    
    class SensitiveText:
      def __init__(self, content):
        self.content = content
    
      def __repr__(self):
        return self.content
    
      def __str__(self):
        return self.content
    
    def sensitive_text_remover(dumper, data):
      return dumper.represent_scalar("tag:yaml.org,2002:null", "")
    
    yaml.add_representer(SensitiveText, sensitive_text_remover)
    
    data = {
      "logging_config": {
        "level": "INFO", 
        "file_path": "/path/to/log_file.log"
      },
      "database_access": {
        "table_to_query": "customer_table",
        "database_api_key": SensitiveText("XXX-XXX-XXX")
      }
    }
    
    print(yaml.dump(data))
    

    打印出来:

    database_access:
      database_api_key:
      table_to_query: customer_table
    logging_config:
      file_path: /path/to/log_file.log
      level: INFO
    

    您当然可以为database_access 开设一个类,而不是使用一个完全删除database_api_key 的代表。

    【讨论】:

      猜你喜欢
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      相关资源
      最近更新 更多