1. 程式人生 > >Django - settings.py 內容分析

Django - settings.py 內容分析

目錄

1、app路徑

2、資料庫配置

3、sql語句:當你的操作與資料庫相關時,會將我們的寫的語句翻譯成sql語句在服務端列印。

4、靜態檔案目錄

5、如果資料庫中的UserInfo(使用者表)繼承django內建AbstractUser

6、中介軟體

7、session儲存的相關配置

8、 TEMPLATES 模板位置

最佳配置例項程式碼


1、app路徑

INSTALLED_APPS = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'app01'

 # 預設已有 如果沒有隻要新增app名稱即可 例如: 'app1'
 # 新建的應用都要在這裡新增
]

2、資料庫配置

# 預設資料庫配置 ; 如果使用django的預設sqlite3資料庫則不需要改
DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.sqlite3',
 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 }
}



# mysql資料庫配置 ;如果使用mysql資料庫需要將上述資料庫注掉修改如下
DATABASES = {
 'default': { 
 'ENGINE': 'django.db.backends.mysql',
 'NAME': 'dbname', #你的資料庫名稱 資料庫需要自己提前建好
 'USER': 'root', #你的資料庫使用者名稱
 'PASSWORD': 'pwd', #你的資料庫密碼
 'HOST': '127.0.0.1', #你的資料庫主機,留空預設為localhost
 'PORT': '3306', #你的資料庫埠
 }
}
# __init__.py檔案
import pymysql
pymysql.install_as_MySQLdb()

 

3、sql語句:當你的操作與資料庫相關時,會將我們的寫的語句翻譯成sql語句在服務端列印。

LOGGING = {
 'version': 1,
 'disable_existing_loggers': False,
 'handlers': {
 'console':{
  'level':'DEBUG',
  'class':'logging.StreamHandler',
 },
 },
 'loggers': {
 'django.db.backends': {
  'handlers': ['console'],
  'propagate': True,
  'level':'DEBUG',
 },
 }
} 

4、靜態檔案目錄

# 可配置多個路徑,匹配路由;查詢資料夾時,會從上至下進行的匹配
STATIC_URL = '/static/' #呼叫時目錄
STATICFILES_DIRS=[
 os.path.join(BASE_DIR,"static"), #具體路徑
 os.path.join(BASE_DIR,"static1"), #具體路徑
]

5、如果資料庫中的UserInfo(使用者表)繼承django內建AbstractUser

1)model需匯入

from django.contrib.auth.models import AbstractUser

2)配置檔案

AUTH_USER_MODEL = "應用名.UserInfo"

6、中介軟體

自己寫的中介軟體,例如:在專案中的md資料夾下md.py檔案中的M1與M2兩個中介軟體

django 中介軟體: django處理一個Request的過程是首先通過django 中介軟體,然後再通過預設的URL方式進行的。

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)資料庫配置(預設)

# 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)快取配置

# 配置 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)預設配置

# 配置 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)也可以自定義配置 但是自定義的配置都要寫到配置檔案最後 程式碼中使用時可以匯入配置

from django.conf import settings
settings.配置名

2)上面所有配置都是針對特定問題需要修改的 系統預設配置不做說明

3)上面配置只是前面django系列隨筆所遇到的常用配置 後續所遇配置都會逐步在此隨筆中持續新增跟新

8、 TEMPLATES 模板位置

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',
            ],
        },
    },
]

 

最佳配置例項程式碼

# 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^[email protected](iulgar$j)faff&^(^[email protected]&+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
# 設定國際化
USE_I18N = True
# 相同內容被不同時區使用者使用,是否以不同內容展示
USE_L10N = 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時才會用到
'''