前言

在查看别人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与账密保存/读取方式的更多相关文章

  1. JS中几种常见的数组算法(前端面试必看)

    JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...

  2. Spring RestTemplate中几种常见的请求方式

    https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...

  3. 自然语言处理的CNN模型中几种常见的池化方法

    自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用   首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...

  4. Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求

    Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939   版权声明 ...

  5. JavaScript 中 4 种常见的内存泄露陷阱

    了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...

  6. 比较C#中几种常见的复制字节数组方法的效率

    在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadBytes,Buffe ...

  7. 比较C#中几种常见的复制字节数组方法的效率[转]

    [原文链接] 在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadByte ...

  8. Java中9种常见的CMS GC问题分析与解决

    1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...

  9. java中几种常见字符集与乱码介绍

    1.  ASCII和Ansi编码 字符内码(charcter code)指的是用来代表字符的内码 .读者在输入和存储文档时都要使用内码,内码分为  单字节内码 -- Single-Byte chara ...

随机推荐

  1. Trie 练习记录

    蒟蒻以前写的逊爆讲解 Trie CF665E Beautiful Subarrays 代码 把之前每个前缀和放进 trie 树里,然后 trie 树上查询即可. CF37C Old Berland L ...

  2. 查看kafka topic的消息offset范围

    查看各个patition消息的最大位移 sh kafka-run-class.sh kafka.tools.GetOffsetShell --topic mytopic --time -1 --bro ...

  3. Kafka中使用Avro编码、解码消息

    1.消费者代码 import com.twitter.bijection.Injection; import com.twitter.bijection.avro.GenericAvroCodecs; ...

  4. 关于Java Integer和Long直接比较

    Integer和Long不能直接equals比较会返回False Long.class源码 ` public boolean equals(Object obj) { if (obj instance ...

  5. js下 Day12、案例

    一.垃圾分类 效果图: 功能思路分析: 1. 鼠标按下 (1) 获取鼠标到元素的距离(e.offsetX) (2) 开启开关变量 (3) 获取事件源 (4) 记录垃圾初始位置 ​  2. 鼠标移动 ( ...

  6. spring的基础面试内容

    1.什么是spring? Spring 是个Java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring 框架目标是简化Java ...

  7. mysql 查询出来的内容无法显示全部

    前几天在做查询的时候,由于使用了字段拼接,所以查出来的其中一列,数据很长,但是每次显示一定的长度后,后面的就无法显示 原因是因为mysql设置查询出来的长度,好像默认是1024,因为我使用的是yii2 ...

  8. Python 爬虫进阶必备

    关于新闻平台请求头加密参数逻辑分析 抓包与加密定位 先来看看加密的请求

  9. 使用IDE练习插件【廖雪峰】

    使用廖雪峰大神的插件,安装过程中,一直出现问题,然后在他的Java教程下面看大家的评论也有点晕了(很多人说的是jar包,结果其实是下的依旧是zip包) 最终解决方法: 将zip包解压到同名文件夹中,再 ...

  10. React Hook 入门使用

    React Hook 是什么 1.没有比官网说的更好的 HOOK 1. React Hook 官方 2. 用我们自己的话说,它是一个钩子函数,用来处理组件间的状态的一个方法,暂时理解为一个高阶函数吧. ...