Django配置信息(全面)

Django的配置文件setting.py用于配置整个网站的环境和功能,核心配置必须有项目密钥配置、域名访问权限、App列表、中间件、资源文件、模板配置、数据库的连接方式。

1、基本配置信息

一个简单的项目必须具备的基本配置信息有:项目路径、密钥配置、域名访问权限、App列表和中间件。
项目的settings.py的基本配置如下:

import os

# 项目路径
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/

# 密钥配置
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '(v_fey0s$cv9v4vr70g1kksdqaufb2=ip1q7uue@b(!t6!zdnv'

# SECURITY WARNING: don't run with debug turned on in production!

#调试模式
DEBUG = True

#域名访问权限
ALLOWED_HOSTS = []

# App列表
# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

各个配置说明如下:

  • 项目路径BASE_DIR: 主要通过os模块读取当前项目在计算机系统的具体路径,该代码在创建项目时自动生成,一般情况下无需更改。
  • 密钥配置SECRET_KEY: 这是一个随机值,在项目创建的时候自动生成,一般情况下无需修改。主要用于重要的数据加密处理,提高项目的安全性,避免遭到攻击恶意破坏。密钥主要用于用户密码CSRF机制会话Session等数据加密。
    • 用户密码:Django内置一套Auth认证系统,该系统具有用户认证和存储用户信息等功能,在创建用户的时候,将用户密码通过密钥进行加密处理,保证用户的安全性。
    • CSRF机制: 该机制主要用于表单提交,防止窃取用户信息来制造恶意请求。
    • 会话Session:Session的信息存放在Cookie中,以一串随机的字符串表示,用于标识当前访问网站的用户身份,记录相关用户信息。
  • 调试模式DEBUG: 该值为布尔类型。如果在开发调试阶段,那么应设置为True,在开发调试过程中会自动检测代码是否发生更改,根据检测结果执行是否刷新重启系统。如果项目部署上线,那么应该改为False,否则会泄露项目相关信息。
  • 域名访问权限ALLOWED_HOSTS: 设置可访问的域名,默认值为空列表。当DEBUG为True并且ALLOWED_HOSTS为空列表时,项目只允许以localhost或127.0.0.1在浏览器上访问。当DEBUG为False时,ALLOWED_HOSTS为必填项,否则程序无法启动,如果允许所有域名访问,可设置ALLOW_HOSTS=["*"]。
  • App列表INSTALLED_APPS: 告诉Django有哪些App。在项目创建时已有admin,auth和sessions等配置信息,这些都是Django内置的应用功能,各个功能说明如下:
    • admin:内置的后台管理系统。
    • auth:内置的用户认证系统。
    • contenttypes:记录项目中所有model元数据(Django的ORM框架)。
    • sessions: Session会话功能,用于标识当前访问网站的用户身份,记录相关用户信息。
    • messages:消息提示功能。
    • staticfiles: 查找静态资源路径。
      如果在项目中创建了App,就必须在App列表INSTALLED_APPS添加App名称。将MyDjango项目已创建的App添加到App列表,代码如下:
      在这里插入图片描述

2、资源文件配置

资源文件配置分为静态资源媒体资源。静态资源的配置方式由配置属性STATIC_URL、STATICFILES_DIRS和STATIC_ROOT进行配置;媒体资源的配置方式有配置属性MEDIA_URL和MEDIA_ROOT决定。

  • 静态资源: 指的是网站中不会改变的文件。在一般的应用程序中,静态资源包括CSS文件、Javascript文件以及图片等资源文件。
  • 媒体资源: 对于一些经常变动的资源,通常将其放在媒体资源文件夹,如用户头像、歌曲文件等。

静态资源和媒体资源可以同时存在,两者可以独立运行,互不影响。

2.1、静态资源

2.1.1 资源路由—STATIC_URL

Django的默认配置信息如下:
在这里插入图片描述上述配置是设置静态文件的路由地址,其作用是通过浏览器访问Django的静态资源。默认情况下,Django只能识别项目应用App的static文件夹里面的静态资源。当项目启动时,Django会从项目应用App里面查找相关的资源文件,查找功能主要由App列表INSTALL_APPS的staticfiles实现。在index(应用名称)中手动创建static文件夹并在文件夹中放入静态文件。
Django在调试模式(DEBUG=True)下只能识别项目应用App的static文件夹里面的静态资源,如果该文件夹改为其他名字,Django就无法识别,若static文件夹放在MyDjango的项目目录下,则Django也是无法识别的。也就是说,资源路由STATIC_URL的值为/static/,则浏览器访问静态资源的网站必须为static,否则无法访问,并且Django在调试模式(DEBUG=True)下只能识别App目录下的static文件夹。

2.1.2 资源集合—STATICFILES_DIRS

存在感: 解决STATIC_URL的不足。由于STATIC_URL的特殊性,在开发中会造成诸多不便,比如将静态文件夹存放在项目的根目录以及定义多个静态文件夹等。
在配置文件settings.py中手动设置STATICFILES_DIRS属性。该属性以列列表形式表示,设置方式如下:

STATICFILES_DIRS = [
# 设置根目录的静态资源文件夹static
os.path.join(BASE_DIR,'static'),
#设置App(index)的静态资源文件夹MyStatic
os.path.join(BASE_DIR,'index/Mystatic'),
]

此时项目中App应用(index)文件下的MyStatic和static以及项目根目录下的static文件夹都可以存放静态资源。浏览器访问的时候,图片路径(静态资源)皆为http://127.0.0.1:8000/static/xxx.jpg。若将STATIC_URL的值改为AllStatic,再次重启项目,则在浏览器上图片资源路径的static则改为Allstatic。

2.1.3 资源部署—STATIC_ROOT

作用是在服务器上部署项目,实现服务器和项目之间的映射。STATIC_ROOT主要收集整个项目的静态资源并放在一个新的文件夹,然后由该文件夹与服务器之间构建映射关系。STATIC_ROOT配置如下:

STATIC_ROOT = os.path.join(BASE_DIR,'AllStatic')

当项目的配置属性DEBUG设为True的时候,Django会自动提供静态文件代理服务,此时整个项目处于开发阶段,因此无需使用STATIC_ROOT。当配置属性DEBUG设为False的时候,意味着项目进入生产环境,Django不再提供静态文件代理服务,此时需要在项目的配置文件中设置STATIC_ROOT。
设置STATIC_ROOT需要使用Django操作指令collectstatic来收集所有静态资源,这些静态资源都会保存STATIC_ROOT所设置的文件夹里。

2.2、媒体资源

在项目的根目录下手动创建media文件夹。

2.2.1、资源路由—MEDIA_URL
# 设置媒体路由地址信息
MEDIA_URL = '/media/'
2.2.2、获取media文件夹在路径信息—MEDIA_ROOT
# 获取media文件夹的完整路径信息
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

配置属性设置后,还需要将media文件夹注册到Django里,让Django知道如何找到媒体文件,否则无法在浏览器上访问该文件夹的文件信息。此时需要打开MyDjango文件夹的urls.py文件,为媒体文件夹media添加相应的路由地址,代码如下:

from django.contrib import admin
from django.urls import path,re_path
# 导入项目应用index
from index.views import index

# 配置媒体文件夹media
from django.views.static import serve
from django.conf import settings

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',index),
    # 配置媒体文件的路由地址
    re_path('media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT},name = 'media'),
]

3、模板配置

在Web开发中,模板是一种特殊的HTML文档。这些HTML文档嵌入了一些能够识别的变量和指令,然后由Django的模板引擎解析这些变量和指令,生成完整的HTML网页并返回给用户浏览。模板Django里面的MTV框架模式的T部分,配置模板路径是告诉Django在解析模板时,如何找到模板所在的位置。创建项目时,Django已有初始的模板配置。如下所示:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

模板配置是以列表格式呈现的,每个元素具有不同的含义,含义说明如下:

  • BACKEND: 定义模板引擎,用于识别模板里面的变量和指令。内置的模板引擎有Django Templates和jinja2.Jinjia2,每个模板引擎都有自己的变量和指令语法。
  • DIRS: 设置模板所在路径,告诉Django在哪个地方找到模板的位置,默认为空列表。
  • APP_DIRS: 是否在App里查找模板文件。
  • OPTIONS: 用于填充在RequestContext的上下文(模板里面的变量和指令),一般情况下不做任何修改。

模板配置通常配置DIRS的属性值即可,在项目的根目录和index下分别创建templates文件夹,并在文件夹下分别创建文件index.html和app_index.html。一般情况下,根目录的templates通常存放共用的模板文件,能为各个App的模板文件调用,这个模式符合代码重复使用原则。则配置信息代码如下:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'index/templates'),
                 ]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

4、数据库配置

数据库配置是选择项目所使用的数据类型,不同的数据库需要设置不同的数据库引擎,数据库引擎实现项目于与数据库的连接。Django提供4种数据库引擎。

  • ‘django.db.backends.postgresql’
  • ‘django.db.backends.mysql’
  • ‘django.db.backends.sqlite3’
  • ‘django.db.backends.oracle’

项目创建时默认使用Sqlite3数据库,这是一款轻型的数据库,常用于嵌入式系统开发,且占用资源非常少。Sqlite3数据库配置信息如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

4.1、 mysqlclient连接MySql

由于mysqldb不支持Python3,因此Django2.0以上版本不再使用mysqldb作为MySql的连接模块,而选择mysqlclient模块,但两者之间在使用上并没有太大的差异。
在配置MySQL之前,需要安装mysqlclient模块。使用pip install mysqlclient即可。
项目的配置文件setting.py中配置MySQL数据库连接信息,代码如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_db',
        'USER':'root',
        'PASSWORD':'123456',
        'HOST':'127.0.0.1',
        'PORT':'3306'
    }
}

为了验证数据库连接信息是否正确,在PyCharm的Terminal界面下输入Django操作指令python manage.py migrate来创建Django内置功能的数据表,能到自己建立的数据库中查找到这些数据表,则表示数据库连接正确!

4.2、pymysql连接MySQL

除了使用mysqlclient模块连接MySQL之外,还可以使用pymysql模块连接MySQL数据库。pymysql模块安装使用pip在线安装即可,pymysql模块安装成功后,项目配置文件settings.py的数据库配置信息无需修改,只要在MyDjango文件夹__init__.py中设置数据库连接模块即可,代码如下:

import pymysql
pymysql.install_as_MySQLdb()

验证的方法与mysqlclient连接MySql一样。值得注意的是,若MySQL是8.0以上版本,在Django连接MySQL数据库时会提示django.db.utils.OperationalError的错误信息,这是因为MySQL8.0版本的密码加密方式发生了改变,8.0版本的用户密码采用的是CHA2加密方式。为了解决这个问题,通过SQL语句将8.0的加密方式改回原来的加密方式,在MySQL的可视化工具中运行以下SQL语句:

# newpassword 是已设置的用户密码
ALERT USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword';
FLUSH PRIVILEGES;

Django除了支持PostgreSQL、SQLite3、MySQL和Oracle之外,还支持SQL Server和MongoDB的连接。

4.3 多个数据库的连接方式

在一个项目中可能需要使用多个数据库才能满足开发需求,特别对于数据量过大的系统,单个数据库存储的数据越多就会使服务器负载越大,因此会将数据划分多个数据库服务器共同存储。

#数据库配置
DATABASES = {
   'default': {
          'ENGINE': 'django.db.backends.mysql', #数据库引擎
          'NAME': 'pythondms',                       #数据库名
          'USER': 'root',                       #用户名
          'PASSWORD': '',                   #密码
          'HOST': '36.103.245.29',                           #数据库主机,默认为localhost
          'PORT': '3306',                           #数据库端口,MySQL默认为3306
          'OPTIONS': {
             'autocommit': True,
         }
    },
    'default1': {
          'ENGINE': 'django.db.backends.mysql', #数据库引擎
          'NAME': 'pythondms',                       #数据库名
          'USER': 'root',                       #用户名
          'PASSWORD': '',                   #密码
          'HOST': '39.107.35.95',                           #数据库主机,默认为localhost
          'PORT': '3306',                           #数据库端口,MySQL默认为3306
          'OPTIONS': {
             'autocommit': True,
         }
    }
}

项目中连接了多个数据库,则数据库之间的使用需要遵从一定的规则和设置。比如项目中定义了多个模型,每个模型所对应的数据表可以选择在某个数据库中生成,如果模型没有指向某个数据库,模型就会在key为default的数据库中生成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章