Django settings詳解
1.基礎
DJANGO_SETTING_MODULE環境變量:讓settings模塊被包含到python可以找到的目錄下,開發情況下不需要,我們通常會在當前文件夾運行,python可以搜索到。如果需要運行在其他服務器上,就必須指定DJANGO_SETTINGS_MODULE變量。
2.默認設定
一個django的settings文件不需要我們手動去設置所有項目,因為系統已經默認設置好了。我們只需要修改我們使用的設
定就好了。默認的設置在django/conf/global_settings.py文件中。django在編譯時,先載入global_settings.py中的配置,然后加載指定的settings文件,重寫改變的設定。
好了,步入正文。
前面的隨筆中我們經常會改setting配置也經常將一些配置混淆今天主要是將一些常見的配置做一個匯總。
setting配置匯總
1、app路徑
1
2
3
4
5
6
7
8
9
10
11
|
INSTALLED_APPS
=
[
'django.contrib.admin'
,
'django.contrib.auth'
,
'django.contrib.contenttypes'
,
'django.contrib.sessions'
,
'django.contrib.messages'
,
'django.contrib.staticfiles'
,
'app1.apps.App1Config'
,
# 默認已有 如果沒有只要添加app名稱即可 例如: 'app1'
# 新建的應用都要在這里添加
]
|
2、數據庫配置
如果使用django的默認sqlite3數據庫則不需要改
1
2
3
4
5
6
|
DATABASES
=
{
'default'
: {
'ENGINE'
:
'django.db.backends.sqlite3'
,
'NAME'
: os.path.join(BASE_DIR,
'db.sqlite3'
),
}
}
|
如果使用mysql數據庫需要將上述數據庫注掉修改如下
1
2
3
4
5
6
7
8
9
10
|
DATABASES
=
{
'default'
: {
'ENGINE'
:
'django.db.backends.mysql'
,
'NAME'
:
'blog'
,
#你的數據庫名稱 數據庫需要自己提前建好
'USER'
:
'root'
,
#你的數據庫用戶名
'PASSWORD'
: '',
#你的數據庫密碼
'HOST'
: '',
#你的數據庫主機,留空默認為localhost
'PORT'
:
'3306'
,
#你的數據庫端口
}
}
|
並且需要在應用的__init__.py文件添加
1
2
|
import
pymysql
pymysql.install_as_MySQLdb()
|
詳情可以查看:http://www.jb51.net/article/128674.htm
3、sql語句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
LOGGING
=
{
'version'
:
1
,
'disable_existing_loggers'
:
False
,
'handlers'
: {
'console'
:{
'level'
:
'DEBUG'
,
'class'
:
'logging.StreamHandler'
,
},
},
'loggers'
: {
'django.db.backends'
: {
'handlers'
: [
'console'
],
'propagate'
:
True
,
'level'
:
'DEBUG'
,
},
}
}
|
當你的操作與數據庫相關時 會將我們的寫的語句翻譯成sql語句在服務端打印。
4、靜態文件目錄
1
2
3
4
|
STATIC_URL
=
'/static/'
#調用時目錄
STATICFILES_DIRS
=
[
os.path.join(BASE_DIR,
"static"
),
#具體路徑
]
|
5、如果數據庫中的UserInfo(用戶表)繼承django內置AbstractUser
1)model需導入
1
|
from
django.contrib.auth.models
import
AbstractUser
|
2)配置文件
1
|
AUTH_USER_MODEL
=
"應用名.UserInfo"
|
6、中間件
自己寫的中間件,例如在項目中的md文件夾下md.py文件中的M1與M2兩個中間件
1
2
3
4
5
6
7
8
9
10
11
|
MIDDLEWARE
=
[
'django.middleware.security.SecurityMiddleware'
,
'django.contrib.sessions.middleware.SessionMiddleware'
,
'django.middleware.common.CommonMiddleware'
,
'django.middleware.csrf.CsrfViewMiddleware'
,
'django.contrib.auth.middleware.AuthenticationMiddleware'
,
'django.contrib.messages.middleware.MessageMiddleware'
,
'django.middleware.clickjacking.XFrameOptionsMiddleware'
,
'md.md.M1'
,
'md.md.M2'
,
]
|
注意自己寫的中間件,配置要寫在系統中的后面
7、session存儲的相關配置
1)數據庫配置(默認)
1
2
3
4
5
6
7
8
9
10
11
|
Django默認支持Session,並且默認是將Session數據存儲在數據庫中,即:django_session 表中。
配置 settings.py
SESSION_ENGINE
=
'django.contrib.sessions.backends.db'
# 引擎(默認)
SESSION_COOKIE_NAME =
"sessionid"
# Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)
SESSION_COOKIE_PATH =
"/"
# Session的cookie保存的路徑(默認)
SESSION_COOKIE_DOMAIN
=
None
# Session的cookie保存的域名(默認)
SESSION_COOKIE_SECURE
=
False
# 是否Https傳輸cookie(默認)
SESSION_COOKIE_HTTPONLY
=
True
# 是否Session的cookie只支持http傳輸(默認)
SESSION_COOKIE_AGE
=
1209600
# Session的cookie失效日期(2周)(默認)
SESSION_EXPIRE_AT_BROWSER_CLOSE
=
False
# 是否關閉瀏覽器使得Session過期(默認)
SESSION_SAVE_EVERY_REQUEST
=
False
# 是否每次請求都保存Session,默認修改之后才保存(默認)
|
2)緩存配置
1
2
3
4
5
6
7
8
9
10
11
|
配置 settings.py
SESSION_ENGINE
=
'django.contrib.sessions.backends.cache'
# 引擎
SESSION_CACHE_ALIAS
=
'default'
# 使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置
SESSION_COOKIE_NAME =
"sessionid"
# Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串
SESSION_COOKIE_PATH =
"/"
# Session的cookie保存的路徑
SESSION_COOKIE_DOMAIN
=
None
# Session的cookie保存的域名
SESSION_COOKIE_SECURE
=
False
# 是否Https傳輸cookie
SESSION_COOKIE_HTTPONLY
=
True
# 是否Session的cookie只支持http傳輸
SESSION_COOKIE_AGE
=
1209600
# Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE
=
False
# 是否關閉瀏覽器使得Session過期
SESSION_SAVE_EVERY_REQUEST
=
False
# 是否每次請求都保存Session,默認修改之后才保存
|
3)默認配置
1
2
3
4
5
6
7
8
9
10
11
|
配置 settings.py
SESSION_ENGINE
=
'django.contrib.sessions.backends.file'
# 引擎
SESSION_FILE_PATH
=
None
# 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()
SESSION_COOKIE_NAME =
"sessionid"
# Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串
SESSION_COOKIE_PATH =
"/"
# Session的cookie保存的路徑
SESSION_COOKIE_DOMAIN
=
None
# Session的cookie保存的域名
SESSION_COOKIE_SECURE
=
False
# 是否Https傳輸cookie
SESSION_COOKIE_HTTPONLY
=
True
# 是否Session的cookie只支持http傳輸
SESSION_COOKIE_AGE
=
1209600
# Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE
=
False
# 是否關閉瀏覽器使得Session過期
SESSION_SAVE_EVERY_REQUEST
=
False
# 是否每次請求都保存Session,默認修改之后才保存
|
注意:
1)也可以自定義配置 但是自定義的配置都要寫到配置文件最后 代碼中使用時可以導入配置
1
2
|
from
django.conf
import
settings
settings.配置名
|
2)上面所有配置都是針對特定問題需要修改的 系統默認配置不做說明
3)上面配置只是前面django系列隨筆所遇到的常用配置 后續所遇配置都會逐步在此隨筆中持續添加跟新
下面看段django settings最佳配置實例代碼,具體代碼如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
# encoding=utf-8
import
os
import
socket
SITE_ID
=
1
# 項目的根目錄
# 簡化后面的操作
PROJECT_ROOT
=
os.path.dirname(os.path.dirname(__file__))
# 加載應用
# 把應用添加到INSTALLED_APPS中
from
apps.kuser.mysetting
import
myapp as kuser_app
from
apps.blog.mysetting
import
myapp as blog_app
MY_APPS
=
blog_app
+
kuser_app
# 加載靜態文件
from
apps.blog.mysetting
import
my_staticfiles as blog_staticfiles
from
apps.kuser.mysetting
import
my_staticfiles as kuser_staticfiles
MY_STATIC_DIRS
=
blog_staticfiles
+
kuser_staticfiles
# 加載模板文件
from
apps.blog.mysetting
import
my_templates as blog_templates
from
apps.kuser.mysetting
import
my_templates as kuser_templates
MY_TEMPLATE_DIRS
=
blog_templates
+
kuser_templates
# 密鑰配置
# 適用於開發環境和部署環境
# 可以從系統環境中,配置文件中,和硬編碼的配置中得到密鑰
try
:
SECRET_KEY
=
os.environ[
'SECRET_KEY'
]
except
:
try
:
with
open
(os.path.join(PROJECT_ROOT,
'db/secret_key'
).replace(
'\\', '
/
')) as f:
SECRET_KEY
=
f.read().strip()
except
:
SECRET_KEY
=
'*lk^6@0l0(iulgar$j)faff&^(^u+qk3j73d18@&+ur^xuTxY'
# 得到主機名
def
hostname():
sys
=
os.name
if
sys
=
=
'nt'
:
hostname
=
os.getenv(
'computername'
)
return
hostname
elif
sys
=
=
'posix'
:
host
=
os.popen(
'echo $HOSTNAME'
)
try
:
hostname
=
host.read()
return
hostname
finally
:
host.close()
else
:
raise
RuntimeError(
'Unkwon hostname'
)
#調試和模板調試配置
#主機名相同則為開發環境,不同則為部署環境
#ALLOWED_HOSTS只在調試環境中才能為空
if
socket.gethostname().lower()
=
=
hostname().lower():
DEBUG
=
TEMPLATE_DEBUG
=
True
ALLOWED_HOSTS
=
[]
else
:
ALLOWED_HOSTS
=
[
'baidu.com'
,
'0.0.0.0'
,
]
DEBUG
=
TEMPLATE_DEBUG
=
False
#數據庫配置
MYDB
=
{
'mysql'
: {
'ENGINE'
:
'django.db.backends.mysql'
,
'NAME'
:
'books'
,
#你的數據庫名稱
'USER'
:
'root'
,
#你的數據庫用戶名
'PASSWORD'
: '',
#你的數據庫密碼
'HOST'
: '',
#你的數據庫主機,留空默認為localhost
'PORT'
:
'3306'
,
#你的數據庫端口
},
'sqlite'
: {
'ENGINE'
:
'django.db.backends.sqlite3'
,
'NAME'
: os.path.join(PROJECT_ROOT,
'db/db.sqlite3'
).replace(
'\\', '
/
'),
}
}
# 給靜態文件url一個后綴,在templates里用到的。
# 映射到靜態文件的url
# STATIC_URL的含義與MEDIA_URL類似
STATIC_URL
=
'/static/'
# 總的static目錄
# 可以使用命令 manage.py collectstatic 自動收集static文件
# STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static').replace('\\', '/')
#放各個app的static目錄及公共的static目錄
#STATICFILES_DIRS:和TEMPLATE_DIRS的含義差不多,就是除了各個app的static目錄以外還需要管理的靜態文件設置,
#比如項目的公共文件差不多。然后給靜態文件變量賦值,告訴Django,靜態文件在哪里
#另外,Django提供了一個findstatic命令來查找指定的靜態文件所在的目錄,例如:D:\TestDjango>python manage.py findstatic Chrome.jpg
# 默認情況下(如果沒有修改STATICFILES_FINDERS的話),Django首先會在STATICFILES_DIRS配置的文件夾中尋找靜態文件,然后再從每個app的static子目錄下查找,
# 並且返回找到的第一個文件。所以我們可以將全局的靜態文件放在STATICFILES_DIRS配置的目錄中,將app獨有的靜態文件放在app的static子目錄中。
# 存放的時候按類別存放在static目錄的子目錄下,如圖片都放在images文件夾中,所有的CSS都放在css文件夾中,所有的js文件都放在js文件夾中。
STATICFILES_DIRS
=
(
(
"downloads"
, os.path.join(PROJECT_ROOT,
'static/downloads'
).replace(
'\\', '
/
')),
(
"uploads"
, os.path.join(PROJECT_ROOT,
'static/uploads'
).replace(
'\\', '
/
')),
)
# 將app中的靜態文件添加到靜態文件配置列表中
STATICFILES_DIRS
+
=
MY_STATIC_DIRS
# 最后關鍵的部分是STATICFILES_DIRS以下配置
# 簡要說一下,static文件夾在項目里,有css js images 三個文件夾(看項目結構),他們的路徑分別是:
# os.path.join(STATIC_ROOT,'css'),os.path.join(STATIC_ROOT,'js'),os.path.join(STATIC_ROOT,'images');
# 我們分別給他們起三個別名css,js,images(你可以隨意給,不過為了易記,我們原名稱指定別名了)
TEMPLATE_DIRS
=
(
os.path.join(PROJECT_ROOT,
'templates'
).replace(
'\\', '
/
'),
)
# 配置應用的模板文件路徑
TEMPLATE_DIRS
+
=
MY_TEMPLATE_DIRS
# 配置緩存
CACHES
=
{
'default'
: {
'BACKEND'
:
'django.core.cache.backends.memcached.MemcachedCache'
,
'LOCATION'
:
'unix:/tmp/memcached.sock'
,
'KEY_PREFIX'
:
'lcfcn'
,
'TIMEOUT'
:
None
}
}
LOGIN_REDIRECT_URL
=
'/'
LOGIN_URL
=
'/auth/login/'
LOGOUT_URL
=
'/auth/logout/'
# 指用戶上傳的文件,比如在Model里面的FileFIeld,ImageField上傳的文件。如果你定義
# MEDIA_ROOT=c:\temp\media,那么File=models.FileField(upload_to="abc/"),上傳的文件就會被保存到c:\temp\media\abc。MEDIA_ROOT必須是本地路徑的絕對路徑。
MEDIA_ROOT
=
os.path.join(PROJECT_ROOT,
'static/uploads'
)
# MEDIA_URL是指從瀏覽器訪問時的地址前綴。
MEDIA_URL
=
'/uploads/'
# 應用注冊列表
INSTALLED_APPS
=
(
'django.contrib.admin'
,
'django.contrib.auth'
,
'django.contrib.contenttypes'
,
'django.contrib.sessions'
,
'django.contrib.messages'
,
'django.contrib.staticfiles'
,
'django.contrib.sites'
,
'django.contrib.sitemaps'
,
)
#為了不和系統應用混合,自己開發的應用放在這里
# 將自己寫的app添加到應用列表中去
INSTALLED_APPS
+
=
MY_APPS
# django 中間件
# django處理一個Request的過程是首先通過django 中間件,然后再通過默認的URL方式進行的。
# 所以說我們要做的就是在django 中間件這個地方把所有Request攔截住,
# 用我們自己的方式完成處理以后直接返回Response,那么我們可以簡化原來的設計思路,
# 把中間件不能處理的 Request統統不管,丟給Django去處理。
MIDDLEWARE_CLASSES
=
(
'django.middleware.cache.UpdateCacheMiddleware'
,
'django.contrib.sessions.middleware.SessionMiddleware'
,
'django.middleware.common.CommonMiddleware'
,
'django.middleware.csrf.CsrfViewMiddleware'
,
'django.contrib.auth.middleware.AuthenticationMiddleware'
,
# 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware'
,
'django.middleware.clickjacking.XFrameOptionsMiddleware'
,
'django.middleware.cache.FetchFromCacheMiddleware'
,
)
ROOT_URLCONF
=
'lcforum.urls'
WSGI_APPLICATION
=
'lcforum.wsgi.application'
#數據庫配置
DATABASES
=
{
'default'
: MYDB.get(
'sqlite'
),
}
# 語言
LANGUAGE_CODE
=
'zh-cn'
# 時區
TIME_ZONE
=
'Asia/Shanghai'
USE_TZ
=
True
# 在template中使用靜態文件
# 采用這種方式需要有一些額外配置,打開settings.py,確認TEMPLATE_CONTEXT_PROCESSORS中包含有'django.core.context_processors.static'
# TEMPLATE_CONTEXT_PROCESSORS = (
# 'django.core.context_processors.debug',
# 'django.core.context_processors.i18n',
# 'django.core.context_processors.media',
# 'django.core.context_processors.static',
# 'django.contrib.auth.context_processors.auth',
# 'django.contrib.messages.context_processors.messages',
#
# 'django.core.context_processors.tz',
# 'django.contrib.messages.context_processors.messages',
# # 'blog.context_processors.custom_proc',自定義函數
# )
#from django.conf import settings
#gettext = lambda s: s
#getattr()
# 假設有個工程djangodemo,有兩個app為demo1跟demo2
# django處理static的方法是把各個app各自的static合並到一處
# 比如:
# djangodemo/djangodemo/static 放置公共靜態文件
# djangodemo/demo1/static 放置該app自己的靜態文件
# djangodemo/demo2/static 放置該app自己的靜態文件
# 可以這么設置:
# STATIC_ROOT = '/www/djangodemo/djangodemo/static '
# STATIC_URL = '/static/'
# STATICFILES_DIRS = (
# 'djangodemo/static',
# 'demo1/static/',
# 'demo2/static/',
# )
# 使用命令
# manage.py collectstatic
# 就會自動把所有靜態文件全部復制到STATIC_ROOT中
# 如果開啟了admin,這一步是很必要的,不然部署到生產環境的時候會找不到樣式文件
# 不要把你項目的靜態文件放到這個目錄。這個目錄只有在運行manage.py collectstatic時才會用到
|