Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何保存数据库配置而不将其写入python文件_Python_Python 3.x_Environment Variables - Fatal编程技术网

如何保存数据库配置而不将其写入python文件

如何保存数据库配置而不将其写入python文件,python,python-3.x,environment-variables,Python,Python 3.x,Environment Variables,我有一个需要数据库凭据的python应用程序,代码如下所示 def __init__ (self): self.conn = pymysql.connect("localhost","user","pass","db", use_unicode=True, charset="utf8") 如您所见,我正在硬编码敏感数据,当我将此代码推送到github时,我必须删除它,当我在服务器上运行它时,我必须修改它。所以,基本上我必须为prod/dev环境编辑这个文件 我知道我们可以在Linux中

我有一个需要数据库凭据的python应用程序,代码如下所示

def __init__ (self):
    self.conn = pymysql.connect("localhost","user","pass","db", use_unicode=True, charset="utf8")
如您所见,我正在硬编码敏感数据,当我将此代码推送到github时,我必须删除它,当我在服务器上运行它时,我必须修改它。所以,基本上我必须为prod/dev环境编辑这个文件


我知道我们可以在Linux中将变量存储为
database\u name=foobar
和更高版本的
echo$database\u name
来检索值,但是我如何在python应用程序中使用它呢

你是说环境变量

您可以这样访问它们:

import os
os.getenv('DATABASE_NAME')
#global_setup.py (separate module) 
MY_DB_SERVER = "localhost"
MY_DB_USER = "user"
MY_DB_PASS = "pass"
MY_DB_DB = "db"

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


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

import os
os.getenv('DATABASE_NAME')
#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。

您可以使用。它允许您使用环境变量并将它们转换为适当的类型

您可以为每个值添加变量,如数据库名称、数据库主机或创建后处理器,并将变量定义为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")

这比环境变量更有效吗?my dev和prod中的数据库具有不同的dbname、pass、user。。。一个
global\u setup.py
如何使我不必每次在dev/prod上运行它时都编辑文件?将所有这些内容放在一个文件中意味着只需设置一次,然后它仍保持配置状态。每次主应用程序运行时,它都会导入包含预期数据库信息的全局设置模块。您将在开发环境中处理临时数据,并且在部署应用程序时,您将使用正确的文本字符串配置该文件。您可以将旧版本保留在您的开发人员帐户中,无需每次都更改它。只需导入正确的模块。例如,
global\u setup\u dev.py
可能包含本地dev数据库信息,
global\u setup.py
可能包含prod设置。虽然数据库访问中没有任何更改,但这些配置文件将不需要更新。但是,一定要调查一下数据库的安全性,特别是如果数据库访问是远程的,或者有其他用户可以物理访问数据库服务器。我不了解的是,如果我重新启动计算机,环境变量是否会被删除?通常在会话期间定义这些变量(可能在另一个过程中)用户会话初始化脚本中的ou。@meskerem你说得对,但它们在每个会话中都会被删除。环境变量的作用是将应用程序与环境解耦。如果你在暂存环境中运行应用程序,则变量将与生产环境不同,但与代码不同。这来自。无论如何,如果env vars没有按照Victor Domingos的建议,根据您的使用情况,还有其他替代方案。您能更详细地介绍一下此代码或任何链接吗??