Python 3.x pymysql:隐藏我的文件的凭据

Python 3.x pymysql:隐藏我的文件的凭据,python-3.x,pymysql,Python 3.x,Pymysql,我有以下代码: from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://edamame:mypassword@1.2.3.4:3306/mydb') 我想隐藏部分:edamame:mypassword@1.2.3.4:3306/mydb。可能放入另一个未提交回购协议的文件中 我可以从另一个文件中读取字符串,但我想知道实现这一点的更好实践或设计是什么?谢谢大家! 是的,这是正确的想法。我喜欢yam

我有以下代码:

from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://edamame:mypassword@1.2.3.4:3306/mydb')
我想隐藏部分:
edamame:mypassword@1.2.3.4:3306/mydb
。可能放入另一个未提交回购协议的文件中


我可以从另一个文件中读取字符串,但我想知道实现这一点的更好实践或设计是什么?谢谢大家!

是的,这是正确的想法。我喜欢yaml的基本配置文件,但你可以使用任何你喜欢的格式。如果您使用yaml,它将如下所示:

  • 使用适当的读/写/执行权限在您的回购协议之外创建yaml文件

    database_info: username: edamame password: mypassword host: 1.2.3.4 port: 3306 database: mydb 数据库信息: 用户名:毛豆 密码:mypassword 主持人:1.2.3.4 港口:3306 数据库:mydb
  • 用PyYAML导入

    import yaml with open('your/file/path/here/db_config.yaml', 'r') as infile: db_cfg = yaml.safe_load(infile) 进口yaml 以open('your/file/path/here/db_config.yaml','r')作为填充: db_cfg=yaml.安全荷载(填充)
  • 访问变量并填充字符串(我通常将其包装在函数中):

    引擎=创建引擎( 'mysql+pymysql://{}:{}@{}:{}/{}'。格式( db_cfg['database_info']['username'], db_cfg['database_info']['mypassword'], db_cfg['database_info']['host'], db_cfg['database_info']['port'], db_cfg['database_info']['database'] ) )

  • 确保您的配置文件不在repo中,并且目录/文件权限正确。如果您正在构建web应用程序,另一个好的选择是环境变量。您可以使用Python的os库访问这些文件

    PyYAML的
    yaml.load()
    被证明是不安全的。对于该YAML,没有理由不使用
    YAML.safe\u load()
    。使用过时的PyYAML有什么特别的原因吗?PyYAML是一个仍然不支持YAML 1.2标准的库(一个9年前发布的标准)?你不应该在你的帖子中放“编辑2:”之类的东西,因为这些信息与你答案的新浏览者无关。总是有编辑历史记录和评论(不再相关时可以删除)。感谢您的反馈,Anthon。您是对的,safe_load()是更好的选择(更新)。PyYAML仍在维护中,YAML 1.1对于这个用例来说已经足够了-您是否考虑了1.1的限制? engine = create_engine( 'mysql+pymysql://{}:{}@{}:{}/{}'.format( db_cfg['database_info']['username'], db_cfg['database_info']['mypassword'], db_cfg['database_info']['host'], db_cfg['database_info']['port'], db_cfg['database_info']['database'] ) )