【问题标题】:How do I save database configuration without writting them on my python file如何保存数据库配置而不将它们写入我的 python 文件
【发布时间】:2017-09-29 19:21:17
【问题描述】:

我有一个需要数据库凭据的 python 应用程序,代码看起来像这样。

def __init__ (self):
    self.conn = pymysql.connect("localhost","user","pass","db", use_unicode=True, charset="utf8")

如您所见,我正在对敏感数据进行硬编码,当我将此代码推送到 github 时,我必须将其删除,而当我在服务器中运行它时,我必须对其进行修改。所以,基本上我必须为 prod/dev 环境编辑这个文件。

我知道我们可以在 Linux 中将变量存储为 database_name=foobar 和后来的 echo $database_name 来检索值,但是如何在我的 python 应用程序中使用它呢?

【问题讨论】:

    标签: python python-3.x environment-variables


    【解决方案1】:

    你的意思是环境变量?

    您可以像这样访问它们:

    import os
    os.getenv('DATABASE_NAME')
    

    【讨论】:

    • 你能给出更详细的代码或任何链接吗??
    【解决方案2】:

    我在类似情况下一直在做的是保留一个包含所有配置设置的单独模块,声明为“常量”变量,如下所示:

    #global_setup.py (separate module) 
    MY_DB_SERVER = "localhost"
    MY_DB_USER = "user"
    MY_DB_PASS = "pass"
    MY_DB_DB = "db"
    

    然后,当您需要使用这些常量时,您可以从该模块导入所有内容。您可以创建一个不包含敏感信息的文件的单独版本,以便上传到公共 Git 服务器。

    # main module
    from global_setup import *
    
    def __init__ (self):
        self.conn = pymysql.connect(MY_DB_SERVER, MY_DB_USER, MY_DB_PASS, MY_DB_DB, use_unicode=True, charset="utf8")
    

    现在,请注意以防您的应用程序部署在用户不应该能够访问数据库本身的环境中,或者如果它将通过非加密连接访问数据库。在这些情况下,您可能需要更多的安全措施,例如通过 SSL 连接,或让服务器端应用程序创建 API。

    【讨论】:

    • 这比环境变量更有效吗?我的 dev 和 prod 中的数据库具有不同的 dbname、pass、user ... global_setup.py 如何让我不必每次在 dev/prod 上运行时都编辑文件?
    • 将所有这些内容放在一个文件中意味着您设置了一次,然后保持配置状态。每次主应用程序运行时,它都会导入包含预期数据库信息的 global_setup 模块。您将在开发环境中使用临时数据,并在部署应用程序时使用正确的文本字符串配置该文件。您可以将旧版本保留在您的开发帐户中,无需每次都更改。只需导入正确的模块。例如,global_setup_dev.py 可能包含您的本地开发数据库信息,global_setup.py 可能包含产品设置。
    • 虽然数据库访问没有任何变化,但这些配置文件不需要更新。但是,请稍微调查一下数据库安全性,尤其是在远程数据库访问或其他用户可以物理访问数据库服务器的情况下。
    【解决方案3】:

    您可以使用envparse module。它允许您使用环境变量并将它们转换为正确的类型。

    您可以为每个值添加变量,如数据库名称、数据库主机,或创建后处理器并将变量定义为 URL:

    from envparse import env  
    
    db_host = env(DB_HOST, 'localhost')
    db_port = env.int(DB_PORT, 3306)
    db_user = env(DB_USER)
    db_pass = env(DB_PASS)
    db_name = env(DB_NAME)
    
    conn = pymysql.connect(db_host,db_user,db_pass,db_name, use_unicode=True, charset="utf8")
    

    【讨论】:

    • 我对环境变量的不理解是,如果我要重启我的机器,它们会被删除吗?
    • 通常您在会话期间(可能在单独的进程中)或在用户会话初始化脚本中定义此类变量。
    • @meskerem 你是对的,但它们在每次会话中都会被删除。环境变量的重点是将应用程序与环境解耦。如果您在暂存环境中运行应用程序,则变量将不同于生产环境,但与代码不同。这来自12factor.net。无论如何,如果环境变量不适合您的用例,还有其他替代方案,正如 Victor Domingos 所建议的那样。
    【解决方案4】:

    python 中有一个模块 ConfigParser 用于创建 .ini 文件并保存凭据并在需要时读取它们。

    https://docs.python.org/3/library/configparser.html

    【讨论】:

      猜你喜欢
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 2022-12-30
      • 1970-01-01
      • 2021-06-19
      相关资源
      最近更新 更多