在django项目中,我们会使用settings.py中定义一些参数,比如:
SECRET_KEY = '!pv4o62*84k9s(u$y%k5$e8vura2_w)y5aa^-(e@4hk&'
DEBUG = True
ALLOWED_HOSTS =['*']
GITHUB_WEBHOOK_KEY='9tXDogwdEUBLJwwgczgfaeNAAbQDXIDo4Yth' WX_APP_SERCRET='b07f584b45cafc8ba28909211'
并且这些参数会随着settings.py上传到github上,这样很不安全,故我们不能将这些参数上传,所以只能想办法将这些机密参数从settings.py中分离出来。
在python中提供了python-decouple:
1.在Django项目的虚拟环境中安装python-decouple
pip install python-decouple
2.添加.env或者.ini文件,并把配置信息写入这个文件
参考目录:https://pypi.org/project/python-decouple/
因为我使用的是.env文件,创建.ini文件的可以参考上面的链接
#a.在Django项目的根目录下,创建.env文件,添加配置信息:
SECRET_KEY = !pv4o62*84k9s(u$y%k5$e8vura2_w)y5aa^-(e@4hk&
DEBUG = True
ALLOWED_HOSTS =*
GITHUB_WEBHOOK_KEY=9tXDogwdEUBLJwwgczgfaeNAAbQDXIDo4Yth WX_APP_SERCRET=b07f584b45cafc8ba28909211
注:不能在每个字符串上加''
#b.将.env添加到.gitignore
因为不能将这个文件传到服务器上,所以必须在.gitignore中添加/.env
/.env
注:如果.gitignore文件不能生效(commit时仍然将.env文件提交了),此时可以执行:
#cmd 进入.gitignore所在的目录下,删除缓存
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
.gitignore 只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未被追踪状态),然后再提交.
3.在settings.py中调用.env中的变量
from decouple import config,Csv
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = config('SECRET_KEY')
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = config('DEBUG',cast=bool)
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())
#微信小程序相关参数
WX_APP_SERCRET=config('WX_APP_SERCRET')
# github webhook key
GITHUB_WEBHOOK_KEY=config('GITHUB_WEBHOOK_KEY')
config中有个参数 cast,在官方文档上是这么写的:
By default, all values returned by decouple are strings, after all they are read from text files or the envvars.
However, your Python code may expect some other value type,
for example:
Django’s DEBUG expects a boolean True or False.
Django’s EMAIL_PORT expects an integer.
Django’s ALLOWED_HOSTS expects a list of hostnames.
Django’s SECURE_PROXY_SSL_HEADER expects a tuple with two elements,
the name of the header to look for and the required value.
cast表示相应的返回值类型,但只能返回常用的基本类型,比如要想返回一个列表,那只能自定义一个lambda函数:
config('ALLOWED_HOSTS', cast=lambda v: [s.strip() for s in v.split(',')])
但是这个写法太复杂了,在decouple中已经定义好了相应的函数Csv():
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())
参考链接:https://pypi.org/project/python-decouple/#id12
4.提交本地修改到github,服务器pull代码
在提交本地代码之前,先将本地的虚拟环境的配置导出来,早pycahrm中打开Terminal,此时显示已经是在项目的根目录下,并且在虚拟环境中,执行
pip freeze >requirements.txt
这样就生成了配置清单,并随后将会被上传值github
git add .
git commit -m 'update'
git push
登录服务器,将github刚刚更新的代码pull下来,进入虚拟环境,然后进入Django项目的根目录下,看到requirements.txt文件,执行:
pip install -r requirements.txt
导入安装更新的包。
5.将.env直接上传到服务器
因为已经将相应的变量通过decouple从settings.py中分离出来了,不用上传github,但是服务器上需要使用这些变量,故需将.env文件上传至服务器的相应目录,保证了这些数据的安全性。
使用scp命令将本地文件上传至阿里云服务器:
scp 本地文件 登录名@服务器ip地址:Django项目根目录下
比如我的上传.env文件到服务器的Django项目根目录下的命令:
scp /e/mysite/.env root@182.92.119.50:/home/mysite/
重启服务器就可以了
service apache2 restart