详解Django配置优化方法

​一、使用多个setting文件

开发Django项目是最常见,也是最麻烦的一个问题就是如何区分开发配置与线上配置。有一些解决方案是利用配置文件是py文件这个特性,在配置里面写一些 if-else 来达到区分线上配置与开发配置的目的。但是当项目较为复杂的时候,这样写的可读性十分差,而且可能产生一些条件判定的BUG。

​ 所以更加推荐的方法是使用多个配置文件。

​ 例如新建一个Django项目的时候,默认结构如下:

myDemoSite
├── manage.py
└── myDemoSite
 ├── __init__.py
 ├── settings.py
 ├── urls.py
 └── wsgi.py

新建一个 settings 的文件夹

里面新建 base.py , dev.py , production.py 这三个文件,并删掉 settings.py 文件。

myDemoSite
├── manage.py
└── myDemoSite
 ├── __init__.py
 ├── settings						<- add
 │   ├── __init__.py			<- add
 │   ├── base.py					<- add
 │   ├── dev.py					<- add
 │   └── production.py		<- add
 ├── urls.py
 └── wsgi.py

base.py 里面是公用的配置,例如 SECRET_KEYINSTALLED_APPS

dev.py 里面是开发环境下的配置,例如 DEBUG=True 、开发环境数据库等

production.py 里是生产环境下的配置,例如线上库的连接等

分别在 dev.py 、 production.py 里引入 base.py

# dev.py 和 production.py
from myDemoSite.settings.base import *

​ 一般在python里面不建议通过 * 来导入,因为可能会引发变量名冲突等异常。但在这里是个例外,因为 base.py 里面是我们的公共配置变量,通过变量名的方法导入的话,代码也会很难看,而且麻烦。

指定配置文件

1. 命令行模式指定配置文件

当使用多配置文件并运行 python manage.py runserver 命令的时候,需要注意的是 Django 此时会报错。

Traceback (most recent call last):
 File "manage.py", line 21, in <module>
 main()
 File "manage.py", line 17, in main
 execute_from_command_line(sys.argv)
……

 File "/python3.7/site-packages/django/conf/__init__.py", line 176, in __init__
 raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.

原因在于我们将 settings.py 文件给删掉了, Django 引擎找不到配置文件。

因此在这里需要手动指定配置文件,只需要在运行命令后加上 --setting 即可: python manage.py runserver --settings=myDemoSite.settings.dev

$> python manage.py runserver --settings=myDemoSite.settings.dev
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

Django version 2.2.7, using settings 'myDemoSite.settings.dev'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

2. Pycharm指定配置文件

如果你是使用的专业版的Pycharm,你一定是习惯直接使用Pycharm来启动服务的方式。这里我们也可以通过修改Pycharm的运行配置信息来达到指定 settings 配置的目的:

  1. 修改配置文件里 Environment variables 配置。添加或修改 DJANGO_SETTINGS_MODULE 参数为 ProjectName.settings.dev
  2. 添加 production 环境下的配置文件,然后重复第1步

使用多个配置环境带来的另一个好处就是,我们还可以根据不同的端口号来使用不同的环境。例如我可以在 8000 端口使用开发环境的配置,在 8001 端口使用模拟生产环境的配置,这样子带来的好处是我们在开发的时候可以同时兼顾多个环境下的状态。

二、使用本地文件管理敏感配置信息

亲爱的朋友,当你辛辛苦苦写好了一个项目,并准备把它开源到github的时候,你一定不希望将你的数据库连接方式也一同上传上来。 可是配置文件又必须得上传,这个时候我们就需要用到 Django-environ 来管理我们的私密信息。

安装方式

使用pip安装

pip install django-environ

官方文档

https://django-environ.readthedocs.io/en/latest/#django-environ

https://github.com/joke2k/django-environ

使用方法

django-environ 的使用十分简单

在项目下新建一个 .env 文件,内容就是数据库连接等需要保密的字段,例如:

DEBUG=on
SECRET_KEY=your-secret-key
DATABASE_URL=psql://urser:un-githubbedpassword@127.0.0.1:8458/database
SQLITE_URL=sqlite:///my-local-sqlite.db
CACHE_URL=memcache://127.0.0.1:11211,127.0.0.1:11212,127.0.0.1:11213
REDIS_URL=rediscache://127.0.0.1:6379/1?client_class=django_redis.client.DefaultClient&password=ungithubbed-secret 

注意:

.env 文件需要添加到你的 .gitignore 文件里,这样才能保护到你的隐私

开源项目可以添加一个 .env.example

在你的setting文件里使用它

# base.py
import environ

ROOT_DIR = environ.Path(__file__)-3 # 获取.env文件的路径
#> environ.Path(__file__)获取到的是base.py的 绝对路径
#> '/demoProjects/myDemoSite/myDemoSite/settings/base.py'
#> environ.Path(__file__)-3 切换到前三层目录
#> '/demoProjects/myDemoSite'

env = environ.Env()
env.read_env(ROOT_DIR.path('.env').root)

DEBUG = env.bool('DEBUG')
# DEBUG = True
# dev.py
from myDemoSite.settings.base import *

DEBUG = env.bool('DEBUG')
# DEBUG = True

environ.Path() 函数是对 os.Path() 的一个补充,支持了 - 操作

django-environ 支持 boolstrlistdictint 等多种数据类型

db_url 会被转换成 django 配置所需要的格式

# .env
DEV_MYSQL=mysql://user:%23password@127.0.0.1:3306/dbname

# dev.py
> env.db_url('DEV_MYSQL')
> <class 'dict'>: {'NAME': 'dbname', 'USER': 'user', 'PASSWORD': '#password', 'HOST': '127.0.0.1', 'PORT': 3306, 'ENGINE': 'django.db.backends.mysql'}

总结

本文介绍使用了多个配置文件区分开发、生产环境,使用 django-environ 管理敏感配置信息的方法。

根据个人习惯,也同样可以使用多个 .env 配置+ 一个 setting.py 配置来实现区分开发、生产环境的目的。

在命令行可以指定所使用的 .env 文件:

PROJECT_ENV=dev python manage.py 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Django的性能优化实现解析

    一 利用标准数据库优化技术 传统数据库优化技术博大精深,不同的数据库有不同的优化技巧,但重心还是有规则的.在这里算是题外话,挑两点通用的说说: 索引,给关键的字段添加索引,性能能更上一层楼,如给表的关联字段,搜索频率高的字段加上索引等.Django建立实体的时候,支持给字段添加索引,具体参考Django.db.models.Field.db_index.按照经验,Django建立实体之前应该早想好表的结构,尽量想到后面的扩展性,避免后面的表的结构变得面目全非. 使用适当字段类型,本来varcha

  • Django代码性能优化与Pycharm Profile使用详解

    前言 pycharm是python的一个商业的集成开发工具,本人感觉做python开发还是很好用的,django是一个很流行的python web开源框架,本文将通过实例代码给大家介绍了关于Django代码性能优化与Pycharm Profile使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 是一段导出数据月报的脚本,原先需要十几秒,优化后只需要1秒多. Pycharm Profile 优化第一步就是Profile,先看看慢在哪里.Pycharm自带Profile

  • Python的Django框架中的select_related函数对QuerySet 查询的优化

    1. 实例的背景说明 假定一个个人信息系统,需要记录系统中各个人的故乡.居住地.以及到过的城市.数据库设计如下: Models.py 内容如下: from django.db import models class Province(models.Model): name = models.CharField(max_length=10) def __unicode__(self): return self.name class City(models.Model): name = models

  • django_orm查询性能优化方法

    查询操作和性能优化 1.基本操作 增 models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs obj = models.Tb1(c1='xx', c2='oo') obj.save() 查 models.Tb1.objects.get(id=123) # 获取单条数据,不存在则报错(不建议) models.Tb1.objects.all() # 获取全部 models.Tb1.objects.filter(na

  • 浅谈django orm 优化

    orm优化 1.数据库技术进行优化,包括给字段加索引,设置唯一性约束等等: 2.查询过滤工作在数据库语句中做,不要放在代码中完成(看情况): 3.如果要一次查询出集合的数量,使用count函数,而不是len函数,但是如果后面还需要到集合,那就用len,因为count还需要进行一次数据库的操作: 4.避免过多的使用count和exists函数: 5.如果需要查询对象的外键,则使用外键字段而不是使用关联的外键的对象的主键: 例子: a.b_id # 正确 a.b.id # 错误 6.在通过all语句

  • django模板结构优化的方法

    模版结构优化 引入模版 有时候一些代码是在许多模版中都用到的.如果我们每次都重复的去拷贝代码那肯定不符合项目的规范.一般我们可以把这些重复性的代码抽取出来,就类似于Python中的函数一样,以后想要使用这些代码的时候,就通过 include 包含进来.这个标签就是 include .示例代码如下: # header.html <p>我是header</p> # footer.html <p>我是footer</p> # main.html {% includ

  • 详解Django配置优化方法

    ​一.使用多个setting文件 开发Django项目是最常见,也是最麻烦的一个问题就是如何区分开发配置与线上配置.有一些解决方案是利用配置文件是py文件这个特性,在配置里面写一些 if-else 来达到区分线上配置与开发配置的目的.但是当项目较为复杂的时候,这样写的可读性十分差,而且可能产生一些条件判定的BUG. ​ 所以更加推荐的方法是使用多个配置文件. ​ 例如新建一个Django项目的时候,默认结构如下: myDemoSite ├── manage.py └── myDemoSite ├

  • 详解Django配置JWT认证方式

    1. 安装 rest_framework + djangorestframework_simplejwt 安装djangorestframework_simplejwt : pip install djangorestframework-simplejwt 安装rest_framework: pip install djangorestframework djangorestframework_simplejwt 是提供 jwt 的 django 应用. 2. 配置好 rest_framewor

  • 详解Django模版中加载静态文件配置方法

    1.settings.INSTALLED_APPS下添加:django.contrib.staticfiles 2.settings.py下添加:STATIC_URL = '/static/' 3. (1)在APP下新建文件夹static,然后在这个static文件夹下创建一个当前APP的名字的文件夹,再把静态文件放到这个文件夹下:(类似于Templates配置) 在模板中这样调用: {% load static %} <img src="{% static 'front/logo.jpg

  • 详解vue-cli + webpack 多页面实例配置优化方法

    本文介绍了vue-cli + webpack 多页面实例配置优化方法,分享给大家 vue+webpack是否有多页面 目前使用vue来做项目,估计大部分都是单页面(SPA)应用,一个轻型的 MVVM 框架,谁用了MVVM框架,就再也回不去JQ时代了,哈哈. 在手机端的项目,使用vue + vue-router是high到爆,不仅仅是我们开发的而言,最主要的用户体检也是开足马力,体检感杠杠的. 那问题来了,使用vue+webpack的单页面是爽到爆,那如果是多页面也能不能high到爆呢?那当然呀,

  • 详解如何配置CLion作为Qt5开发环境的方法

    使用Qt进行程序开发时QtCreator总是不二之选.作为老牌IDE在提供了强大的功能同时也对Qt的支持做了许多优化.如果没有特别的原因你应该使用它. 然而一个顺手的工具将会极大得提升生产效率,而如果你之前使用别的工具进行开发,那么就要斟酌一下学习使用QtCreator的成本了. 所以我将介绍配置CLion(另一个强大的c++ IDE)作为Qt5的开发环境,在利用现有工具链的同时避免了安装另一个大型软件. 准备工作 CLion的安装和激活超出了本文的讨论范围,我们假设你已经安装好了CLion.如

  • 详解django使用include无法跳转的解决方法

    一般的django项目我都喜欢采用以下的文件结构,使用include的方式,实现从总的url分配给apps里面的url Example: -projtect ---apps -----user -------urls.py -urls.py 但突然发现无法跳转,竟然是总url的这个错误! 以下是错误做法 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^', views.Index.as_view(), name='index'),

  • 详解Django中views数据查询使用locals()函数进行优化

    优化场景 利用视图函数(views)查询数据之后可以通过上下文context.字典.列表等方式将数据传递给HTML模板,由template引擎接收数据并完成解析.但是通过context传递数据可能就存在在不同的视图函数中使用重复的查询语句,所以可以通过将重复查询语句设置全局变量,配合locals()函数进行数据查询与传递. 优化前 def index(request): threatname = '威胁情报展示' url = 'www.testtip.com' allthreat = Threa

  • 详解maven配置多仓库的方法示例

    刚接触maven就是在公司里配置好的,所以一直以来使用都没毛病,所以一直没有去动这些固有的东西. 但是,后来把公司的电脑拿回家之后,发现有的东西就搞不起来了.原因也看一下就明白了,因为在公司的时候用的是公司的maven私服,所以回家后,用不了也是正常. 但是,真的脱离了公司,自己就不能工作了吗?不可能吧. 难道一下开源工具都必须要依赖于公司的网络? 这明显是不合理的. 那么,就扯出本次文章的意义了,在家里,自然是要公有的maven仓库了,那么,怎样配置maven仓库才能让自己用起来顺心呢? 1.

  • 详解MyBatis配置typeAliases的方法

    0x00:前言参考 之前的<MyBatis 中 SqlMapConfig 配置文件详解>记了一下 MyBatis 中的核心配置文件各个标签的作用和使用场景,这篇文章细说一下配置文件中 typeAliases 标签的详细使用. 0x01:标签介绍 在 MyBatis 的 sql 映射配置文件中,需要使用 paramterType.resultType 来设置 sql 语句的输入输出参数,一般参数都是基本的数据类型或封装类型,但都需要声明该类型的全路径,java.lang.String,或者 cn

  • 详解CLion配置openMP的方法

    使用MinGW64在Clion中配置openMP的开发 安装MinGW64和CLion配置CMakeList.txtCLion 2020.2.3 Build #CL-202.7319.72, built on September 18, 2020 对openMP编译制导的格式问题踩坑 下载 MinGW64 CLion 创建工程,配置CMakeList.txt cmake_minimum_required(VERSION 3.17) project(openMP C) set(CMAKE_C_ST

随机推荐