本文首發(fā)于公眾號:Hunter后端
原文鏈接:Django筆記三十九之settings配置介紹
這一篇筆記介紹 Django 里 settings.py 里一些常用的配置項(xiàng),這些配置有一些是在之前的筆記中有過介紹的,比如 logging 的日志配置,session 的會話配置等,這里就只做一下簡單的回顧,有一些是之前沒有介紹過的就著重介紹一下。
以下是本篇筆記目錄:
- 郵箱配置
- 允許訪問地址配置
- 數(shù)據(jù)庫配置
- 調(diào)試模式配置
- 注冊應(yīng)用程序配置
- 時(shí)區(qū)時(shí)間配置
- 會話配置
- 其他配置
1、郵箱配置
在前一篇筆記發(fā)送郵件的介紹中,有過詳細(xì)的介紹,比如 EMAIL_BACKEND,EMAIL_HOST 等,這里額外再介紹一個(gè)參數(shù) ADMINS
。
這個(gè)參數(shù)其實(shí)在第三十篇筆記 log 日志記錄中有過介紹,當(dāng)我們設(shè)置的日志發(fā)送郵件模塊有指定等級的日志發(fā)生時(shí),會將郵件發(fā)送至 ADMINS 中定義的收件人列表。
這個(gè)參數(shù)是一個(gè)列表,每個(gè)元素也是一個(gè)元組或列表,第一個(gè)參數(shù)為收件人的名稱,第二個(gè)為收件人郵箱:
ADMINS = [
("Hunter", "120460xxx@qq.com"),
]
2、允許訪問地址配置
我們的系統(tǒng)是可以設(shè)置允許訪問的地址的,可以設(shè)置域名或者 IP,比如:
ALLOWED_HOSTS = ["192.168.1.9"]
這個(gè)參數(shù)的默認(rèn)值為空列表,則說明只允許該系統(tǒng)所在的服務(wù)器地址的其他服務(wù)可以訪問到 Django 服務(wù)。
如果想設(shè)置所有地址都可以訪問到我們的服務(wù),可以如此設(shè)置:
ALLOWED_HOSTS = ["*"]
3、數(shù)據(jù)庫配置
前面連接數(shù)據(jù)庫的時(shí)候,沒有做過多的介紹,都是直接使用,這里再做一下詳細(xì)的介紹,以下是一個(gè)示例:
DATABASES = {
'default': {
'ENGINE': "django.db.backends.mysql",
"HOST": "192.168.1.31",
'NAME': "func_test",
"USER": "root",
"PASSWORD": "123456",
"PORT": 3306,
"OPTIONS": {},
"TEST": {},
},
}
在 DATABASES 中,必須設(shè)置一個(gè) default 數(shù)據(jù)庫,也可以在里面添加其他數(shù)據(jù)庫連接,比如之前的多數(shù)據(jù)庫連接操作的筆記示例
其中,ENGINE 表示連接的數(shù)據(jù)庫類型,這里我們設(shè)置的是 MySQL,也可以設(shè)置成 postgresql,oracle,sqlite3。
這里我們連接使用的都是 MySQL,所以下面的配置項(xiàng)都是基于 MySQL 做的介紹。
HOST 表示連接數(shù)據(jù)庫的主機(jī)
NAME 表示要使用的數(shù)據(jù)庫名稱,比如我們這里 MySQL 的 func_test。如果使用的是 SQLite,那么這個(gè)地址應(yīng)該是一個(gè)完整路徑,下面是一個(gè)使用 SQLite 作為數(shù)據(jù)庫的示例:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/Users/hunter/…/sqlite3.db'
}
}
USER 表示的是連接 MySQL 用到的用戶名
PASSWORD 則是密碼
PORT MySQL 一般是 3306,如果是映射的其他端口改成其他端口即可
CONN_MAX_AGE
還有一個(gè)參數(shù)為 CONN_MAX_AGE,表示一個(gè)數(shù)據(jù)庫連接的壽命,以秒為整數(shù),默認(rèn)為 0,表示每次數(shù)據(jù)庫請求結(jié)束之后即關(guān)閉數(shù)據(jù)庫連接。
如果設(shè)置為 60,那么數(shù)據(jù)庫連接在開啟之后 60s 即關(guān)閉此連接,在此期間,其他請求可以復(fù)用此連接。
如果設(shè)置為 None,則表示一直處于連接狀態(tài)。
OPTIONS
是用于添加連接數(shù)據(jù)庫時(shí)額外的參數(shù),比如我們的 MySQL 的連接配置不直接在 DATABASES 中定義,而是通過配置文件的方式使用,如下官方文檔的一個(gè)使用示例:
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'read_default_file': '/path/to/my.cnf',
},
}
}
# my.cnf
[client]
database = NAME
user = USER
password = PASSWORD
default-character-set = utf8
這里的意思是,DATABASES 里的 default 數(shù)據(jù)庫連接使用的都是 my.cnf 里的配置選項(xiàng)
如果同時(shí)我們在 DATABASES["default"] 中也配置了 NAME,USER,PASSWORD 等參數(shù),連接應(yīng)該以哪個(gè)為準(zhǔn)呢?
是以 OPTIONS 里的參數(shù)為準(zhǔn),這里默認(rèn)的讀取配置順序是 OPTIONS > NAME, USER, PASSWORD, HOST, PORT
我們還可以在 OPTIONS 里設(shè)置數(shù)據(jù)庫的隔離等級:
* 'read uncommitted' 讀未提交
* 'read committed' 讀已提交
* 'repeatable read' 可重復(fù)讀
* 'serializable' 串行化
TEST
TEST 參數(shù)默認(rèn)也是一個(gè)空 dict,之前在單元測試那篇筆記中有過介紹,可以設(shè)置測試數(shù)據(jù)庫的字符集編碼,指定測試數(shù)據(jù)庫名稱等信息,示例如下:
DATABASES = {
'default': {
...
"TEST": {
"CHARSET": "utf8",
"NAME": "test_default_db",
},
}
}
4、調(diào)試模式配置
我們通過 settings 中的 DEBUG 參數(shù)來控制 Django 系統(tǒng)是否處于調(diào)試模式,DEBUG=True
則表示系統(tǒng)處于調(diào)試模式。
注意:永遠(yuǎn)不要在 DEBUG=True 的情況下將網(wǎng)站部署到生產(chǎn)環(huán)境
調(diào)試模式的主要功能之一就是顯示詳細(xì)的錯(cuò)誤頁面,比如在 DEBUG=True 的情況下,如果我們的接口發(fā)生異常,Django會顯示一個(gè)詳細(xì)的回溯,比如下面的信息:
而如果我們設(shè)置 DEBUG=False,顯示的信息就會如下:
返回給前臺的就是一個(gè)簡單的錯(cuò)誤頁面,而不是像上面一樣暴露出詳細(xì)的文件路徑和錯(cuò)誤信息
5、注冊應(yīng)用程序配置
INSTALLED_APPS,列表參數(shù),元素是在這個(gè) Django 系統(tǒng)中被啟用的應(yīng)用程序。
這個(gè)參數(shù)包含了 Django 系統(tǒng)初始化時(shí)候的一些配置類應(yīng)用程序,比如 django.contrib.admin, django.contrib.sessions 等
也包含我們創(chuàng)建的 application,比如我們創(chuàng)建了一個(gè)名為 blog 的 application,就可以在其中添加 'blog.apps.BlogConfig' 才可以被系統(tǒng)檢測到
6、時(shí)區(qū)時(shí)間配置
時(shí)區(qū)的設(shè)置與 settings.py 里的兩個(gè)參數(shù)相關(guān),一個(gè)是 TIME_ZONE,一個(gè)是 USE_TZ
TIME_ZONE 表示是時(shí)區(qū),USE_TZ 表示是否默認(rèn)是使用時(shí)區(qū)感知
我們獲取當(dāng)前時(shí)間有兩個(gè)方式,一個(gè)是通過 datetime,一個(gè)是通過 django.utils.timezone 獲取:
import datetime
print(datetime.datetime.now())
from django.utils import timezone
print(timezone.now())
如果設(shè)置 USE_TZ = True
,不管 TIME_ZONE 設(shè)置的時(shí)區(qū)是哪個(gè),timezone.now() 輸出的永遠(yuǎn)是 UTC 時(shí)間,也就是格林威治時(shí)間,也就是比我們現(xiàn)在要早八個(gè)小時(shí)的時(shí)間
而 datetime.datetime.now() 則是會根據(jù) TIME_ZONE設(shè)置的時(shí)區(qū)顯示時(shí)間,比如設(shè)置為 “Ameraica/Chicago” 則會比格林威治時(shí)間早六個(gè)小時(shí),比我們當(dāng)前時(shí)間早14個(gè)小時(shí)
但是我們存儲到數(shù)據(jù)庫的時(shí)間是使用 timezone 的時(shí)間的,所以這個(gè)設(shè)置不太對的。
如果想要存儲到數(shù)據(jù)庫的時(shí)間和我們本地的時(shí)間一致,我們需要設(shè)置 USE_TZ 為 False,且設(shè)置 TIME_ZONE 的值為我們當(dāng)前時(shí)區(qū)東八區(qū)的時(shí)區(qū),這樣,這兩個(gè)輸出的時(shí)間值就一致了,且數(shù)據(jù)庫中存儲的值也是與我們當(dāng)前時(shí)間一致:
# settings.py
TIME_ZONE = "Asia/Shanghai"
USE_TZ = False
import datetime
from django.utils import timezone
print(datetime.datetime.now())
print(timezone.now())
# 2023-02-26 22:33:00.442966
# 2023-02-26 22:33:00.442982
7、會話配置
session 相關(guān)的配置在第三十二篇筆記的時(shí)候有過詳細(xì)介紹,這里只做一個(gè)索引介紹
SESSION_COOKIE_AGE
session 過期時(shí)間,以秒為單位
SESSION_COOKIE_NAME
用于會話的 cookie 的名稱,默認(rèn)為 sessionid,可在 settings.py 中自定義修改
SESSION_ENGINE
控制 Django 存儲會話數(shù)據(jù)的地方,默認(rèn)值為 'django.contrib.sessions.backends.db',也就是數(shù)據(jù)庫,django_session 這張表。
我們還在緩存那篇筆記中有過介紹如何將 session 存儲到 Redis 緩存中,這里不重復(fù)介紹了。
8、其他配置
還有一些配置,比如 日志配置 LOGGING,中間件配置 MIDDLEWARE 等,都在日志筆記,中間件筆記中都有過介紹,這里就不再贅述了。
這里介紹一下如何訪問 settings 中的配置,可以通過文件路徑的形式訪問,也可以通過 django.conf 訪問:文章來源:http://www.zghlxwxcb.cn/news/detail-437532.html
from hunter import settings
print(settings.DATABASES)
from django.conf import settings
print(settings.DATABASES)
這里,hunter 為我們系統(tǒng)的名稱,所以在系統(tǒng)根目錄下,hunter/ 也是 settings.py 文件的上層文件夾。
如果想獲取更多后端相關(guān)文章,可掃碼關(guān)注閱讀:文章來源地址http://www.zghlxwxcb.cn/news/detail-437532.html
到了這里,關(guān)于Django筆記三十九之settings配置介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!