当前位置: 首页 > 科技观察

Python项目读写配置的正确方法

时间:2023-03-12 04:09:22 科技观察

1.在Python文件中编写配置非常简单,但存在严重的安全问题。我们都知道配置不应该写在代码中。如果有人把我们的源码上传到github上,那么数据库的配置就相当于对外开放了。当然,当配置文件不包含敏感信息时,也可以使用这种简单的方法。2.使用外部配置文件将配置文件和代码分离,通常使用json、yaml或ini文件格式来存储配置。结合环境变量和python库读取外部文件,首先,开发通常不会接触生产环境,所以生产环境的配置文件都是运维写的。运维写好应用需要的配置后,放到生产服务器上。指定位置,代码从指定位置读取配置。为了方便程序的统一调试,可以事先约定一个系统环境变量(XXX_CONFIG_PATH)来指定配置文件的存放路径。例如:exportXXX_CONFIG_PATH=/home/test/configs/config.ini这个是设置临时环境变量linux,ubuntu环境变量查看环境变量:env设置永久环境变量1.编辑/etc/profile文件下,changed环境变量是针对所有用户的exportCLASSPATH=/../...这个路径是绝对路径2.如果在当前用户目录下的./barsh_profile文件中修改,只会对当前用户生效uservim/home/wens/.barshcexportCLASSPATH=/../...这个路径是绝对路径。最后使用source命令直接让环境变量生效。source/home/wens/.barshc//直接按照环境变量文件windows环境变量查看环境变量:set查看环境变量:setpath修改环境变量,输入“setvariablename=variablecontent”。例如设置路径为“d:\nmake.exe”,只需输入setpath="d:\nmake.exe"注意:在cmd命令行下对环境变量的所有修改只对当前窗口有效,不永久修改。也就是说,当cmd命令行窗口关闭后,就不再起作用了。永久修改环境变量有两种方法:一种是直接修改注册表,另一种是通过我的电脑->属性->高级设置系统环境变量(详见)设置环境变量后,需要重启pycharm生效3.直接使用系统环境变量读取配置这种方法不使用文件来存储配置信息,而是将所有的配置信息存储在环境变量中。之前将需要配置的信息导入到环境变量中。不使用文件存储在一定程度上加强了对密码等配置信息的保护,但也增加了运维的工作量,尤其是需要修改配置的时候。4、微服务架构在一些微服务架构中,专门开发了一个配置中心,程序直接从线上读取配置,同时还开发了一套GUI进行配置管理,方便开发和运维。5、一般项目中推荐的配置方式-app-__init.py-app.py-settings-__init__.py-base.py-dev.py-prod.py其中,在__init__.py中,加入判断逻辑进行判断当前根据环境是使用开发环境还是生产环境,加载不同的配置参数。#settings/__init__.pyimportos#os.environ.get()用于获取系统中的环境变量,因为在生产环境中,一般会把一些关键参数写入系统环境中。#所以PROFILE的值其实就是我们配置的环境变量的值。如果不配置这个值,默认使用dev配置。#PYTHON_PRO_PROFILE=os.environ.get("PYTHON_PRO_PROFILE","dev")PYTHON_PRO_PROFILE=os.environ.get("PYTHON_PRO_PROFILE")print("是开发环境还是生产环境:",PYTHON_PRO_PROFILE)ifPYTHON_PRO_PROFILE=="dev":from.devimport*elifPYTHON_PRO_PROFILE=="prod":from.prodimport*else:raiseException("Notsupportedruntimeprofile{}".format(PYTHON_PRO_PROFILE))其中base.py存储了一些常见的配置,然后在开发环境dev.py和生产环境prod.py中导入base.py的变量。#settings/base.pyimportosimporttime#os.path.abspath:获取完整路径(包括文件名)os.path.split(current_exec_dir_name)current_up2_dir,_=os.path.split(current_up_dir)print('------logdir=------',current_up2_dir)#日志文件路径设置log_path=f"{current_up2_dir}/logs"如果不是os.path.exists(log_path):os.makedirs(log_path)t=time.strftime("%Y_%m_%d")log_path_file=f"{log_path}/interface_log_{t}.log"wheredev.py:#导入base下的所有参数from.baseimport*database={"protocol":"mysql+mysqlconnector","username":"xxxxxx","password":"hashstring","port":3306,"database":"repo"}whereprod.py:#导入base下的所有参数from.baseimport*database={"protocol":"xxxxxxxxxxx","username":"xxxxxxxxxxxx","password":"xxxxxxxxxxx","port":3344,"database":"xxxx"}对于一些敏感信息,我t可以在环境变量中设置,通过以下方法获取,例如:MAIL_SERVER=os.environ.get('MAIL_SERVER','smtp.163.com')MAIL_USERNAME=os.environ.get('MAIL_USERNAME')or'test'MAIL_PASSWORD=os.environ.get('MAIL_PASSWORD')or'12345678'

猜你喜欢