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路徑
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數據庫則不需要改
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}如果使用mysql數據庫需要將上述數據庫注掉修改如下
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'blog', #你的數據庫名稱 數據庫需要自己提前建好 'USER': 'root', #你的數據庫用戶名 'PASSWORD': '', #你的數據庫密碼 'HOST': '', #你的數據庫主機,留空默認為localhost 'PORT': '3306', #你的數據庫端口 }}并且需要在應用的__init__.py文件添加
import pymysqlpymysql.install_as_MySQLdb()
3、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', }, }} 當你的操作與數據庫相關時 會將我們的寫的語句翻譯成sql語句在服務端打印。
4、靜態文件目錄
STATIC_URL = '/static/' #調用時目錄STATICFILES_DIRS=[ os.path.join(BASE_DIR,"static"), #具體路徑]
5、如果數據庫中的UserInfo(用戶表)繼承django內置AbstractUser
1)model需導入
from django.contrib.auth.models import AbstractUser
2)配置文件
AUTH_USER_MODEL = "應用名.UserInfo"
6、中間件
自己寫的中間件,例如在項目中的md文件夾下md.py文件中的M1與M2兩個中間件
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 settingssettings.配置名
2)上面所有配置都是針對特定問題需要修改的 系統默認配置不做說明
3)上面配置只是前面django系列隨筆所遇到的常用配置 后續所遇配置都會逐步在此隨筆中持續添加跟新
下面看段django settings最佳配置實例代碼,具體代碼如下所示:
# encoding=utf-8import osimport socketSITE_ID = 1# 項目的根目錄# 簡化后面的操作PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__))# 加載應用# 把應用添加到INSTALLED_APPS中from apps.kuser.mysetting import myapp as kuser_appfrom apps.blog.mysetting import myapp as blog_appMY_APPS = blog_app + kuser_app# 加載靜態文件from apps.blog.mysetting import my_staticfiles as blog_staticfilesfrom apps.kuser.mysetting import my_staticfiles as kuser_staticfilesMY_STATIC_DIRS = blog_staticfiles + kuser_staticfiles# 加載模板文件from apps.blog.mysetting import my_templates as blog_templatesfrom apps.kuser.mysetting import my_templates as kuser_templatesMY_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時才會用到總結
以上所述是小編給大家介紹的django中的setting最佳配置小結,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!
新聞熱點
疑難解答