Django中一种常见的setting与账密保存/读取方式
前言
在查看别人Django代码的时候,发现很多的manager文件都是类似于
#!/usr/bin/env python
import os
import sys if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'conf.development.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
这种的
然后部署时又需要先设置环境变量,看配置文件有.env又有setting.py,这是怎么回事呢?
正文
就以我们之前的某个项目为例,同事写的就是这样的结构.
在 conf 文件夹下的 production文件夹 中有着 settings.py 存放 django 的一些设置,同级目录下还有 .env 文件存放一些账密
那么在请求进入的时候,django是怎样获取这些配置的呢?
我们来从请求进入说起
supervisor托管时会先将整体的settings写入当前shell的环境变量(已下为supervisor配置节选)
environment=DJANGO_SETTINGS_MODULE=conf.production.settings
此时该进程中有环境变量 DJANGO_SETTINGS_MODULE 为 conf.production.settings
然后django按照环境变量去寻找该文件,解析settings.py
我们来看 settings.py 的部分代码
在开头部分,引用了os和dotenv模块
dovent模块可以将.env文件按每行 k=v 的格式解析出相应的键值对存入环境变量中,代码注释后为
# 拼接路径为当前绝对路径下的.env文件
dotenv_path = join(dirname(__file__), '.env')
# load_dovent作用解析.env文件的配置项写入环境变量
load_dotenv(dotenv_path)
.env文件节选内容为
然后我们发现. settings.py中有些账密的配置是存储在.env中, 启动时通过环境变量写入, 而在settings中引入则为
使用 os.environ.get 按照key读取环境变量的值,
而一些不太重要的或者不变的(比如Django时区什么的),就明文写在了settings.py中直接读取
好处
显而易见的,将账密单独存储至 .env 文件可增加部分安全性,将经常改变的配置项写在 .env 也可增加部分可维护性
但是对于之前没有做过类似模式的同学来说可能较难懂,这也是本篇博文的目的所在.希望对你有所帮助.
Django中一种常见的setting与账密保存/读取方式的更多相关文章
- JS中几种常见的数组算法(前端面试必看)
JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...
- Spring RestTemplate中几种常见的请求方式
https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...
- 自然语言处理的CNN模型中几种常见的池化方法
自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用 首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...
- Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求
Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939 版权声明 ...
- JavaScript 中 4 种常见的内存泄露陷阱
了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...
- 比较C#中几种常见的复制字节数组方法的效率
在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadBytes,Buffe ...
- 比较C#中几种常见的复制字节数组方法的效率[转]
[原文链接] 在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadByte ...
- Java中9种常见的CMS GC问题分析与解决
1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...
- java中几种常见字符集与乱码介绍
1. ASCII和Ansi编码 字符内码(charcter code)指的是用来代表字符的内码 .读者在输入和存储文档时都要使用内码,内码分为 单字节内码 -- Single-Byte chara ...
随机推荐
- Trie 练习记录
蒟蒻以前写的逊爆讲解 Trie CF665E Beautiful Subarrays 代码 把之前每个前缀和放进 trie 树里,然后 trie 树上查询即可. CF37C Old Berland L ...
- 查看kafka topic的消息offset范围
查看各个patition消息的最大位移 sh kafka-run-class.sh kafka.tools.GetOffsetShell --topic mytopic --time -1 --bro ...
- Kafka中使用Avro编码、解码消息
1.消费者代码 import com.twitter.bijection.Injection; import com.twitter.bijection.avro.GenericAvroCodecs; ...
- 关于Java Integer和Long直接比较
Integer和Long不能直接equals比较会返回False Long.class源码 ` public boolean equals(Object obj) { if (obj instance ...
- js下 Day12、案例
一.垃圾分类 效果图: 功能思路分析: 1. 鼠标按下 (1) 获取鼠标到元素的距离(e.offsetX) (2) 开启开关变量 (3) 获取事件源 (4) 记录垃圾初始位置 2. 鼠标移动 ( ...
- spring的基础面试内容
1.什么是spring? Spring 是个Java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring 框架目标是简化Java ...
- mysql 查询出来的内容无法显示全部
前几天在做查询的时候,由于使用了字段拼接,所以查出来的其中一列,数据很长,但是每次显示一定的长度后,后面的就无法显示 原因是因为mysql设置查询出来的长度,好像默认是1024,因为我使用的是yii2 ...
- Python 爬虫进阶必备
关于新闻平台请求头加密参数逻辑分析 抓包与加密定位 先来看看加密的请求
- 使用IDE练习插件【廖雪峰】
使用廖雪峰大神的插件,安装过程中,一直出现问题,然后在他的Java教程下面看大家的评论也有点晕了(很多人说的是jar包,结果其实是下的依旧是zip包) 最终解决方法: 将zip包解压到同名文件夹中,再 ...
- React Hook 入门使用
React Hook 是什么 1.没有比官网说的更好的 HOOK 1. React Hook 官方 2. 用我们自己的话说,它是一个钩子函数,用来处理组件间的状态的一个方法,暂时理解为一个高阶函数吧. ...