django中的setting最佳配置小結(jié)
Django settings詳解
1.基礎(chǔ)
DJANGO_SETTING_MODULE環(huán)境變量:讓settings模塊被包含到python可以找到的目錄下,開(kāi)發(fā)情況下不需要,我們通常會(huì)在當(dāng)前文件夾運(yùn)行,python可以搜索到。如果需要運(yùn)行在其他服務(wù)器上,就必須指定DJANGO_SETTINGS_MODULE變量。
2.默認(rèn)設(shè)定
一個(gè)django的settings文件不需要我們手動(dòng)去設(shè)置所有項(xiàng)目,因?yàn)橄到y(tǒng)已經(jīng)默認(rèn)設(shè)置好了。我們只需要修改我們使用的設(shè)
定就好了。默認(rèn)的設(shè)置在django/conf/global_settings.py文件中。django在編譯時(shí),先載入global_settings.py中的配置,然后加載指定的settings文件,重寫(xiě)改變的設(shè)定。
好了,步入正文。
前面的隨筆中我們經(jīng)常會(huì)改setting配置也經(jīng)常將一些配置混淆今天主要是將一些常見(jiàn)的配置做一個(gè)匯總。
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', # 默認(rèn)已有 如果沒(méi)有只要添加app名稱(chēng)即可 例如: 'app1' # 新建的應(yīng)用都要在這里添加 ]
2、數(shù)據(jù)庫(kù)配置
如果使用django的默認(rèn)sqlite3數(shù)據(jù)庫(kù)則不需要改
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
如果使用mysql數(shù)據(jù)庫(kù)需要將上述數(shù)據(jù)庫(kù)注掉修改如下
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'blog', #你的數(shù)據(jù)庫(kù)名稱(chēng) 數(shù)據(jù)庫(kù)需要自己提前建好 'USER': 'root', #你的數(shù)據(jù)庫(kù)用戶名 'PASSWORD': '', #你的數(shù)據(jù)庫(kù)密碼 'HOST': '', #你的數(shù)據(jù)庫(kù)主機(jī),留空默認(rèn)為localhost 'PORT': '3306', #你的數(shù)據(jù)庫(kù)端口 } }
并且需要在應(yīng)用的__init__.py文件添加
import pymysql pymysql.install_as_MySQLdb()
詳情可以查看:http://www.dbjr.com.cn/article/128674.htm
3、sql語(yǔ)句
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
當(dāng)你的操作與數(shù)據(jù)庫(kù)相關(guān)時(shí) 會(huì)將我們的寫(xiě)的語(yǔ)句翻譯成sql語(yǔ)句在服務(wù)端打印。
4、靜態(tài)文件目錄
STATIC_URL = '/static/' #調(diào)用時(shí)目錄 STATICFILES_DIRS=[ os.path.join(BASE_DIR,"static"), #具體路徑 ]
5、如果數(shù)據(jù)庫(kù)中的UserInfo(用戶表)繼承django內(nèi)置AbstractUser
1)model需導(dǎo)入
from django.contrib.auth.models import AbstractUser
2)配置文件
AUTH_USER_MODEL = "應(yīng)用名.UserInfo"
6、中間件
自己寫(xiě)的中間件,例如在項(xiàng)目中的md文件夾下md.py文件中的M1與M2兩個(gè)中間件
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', ]
注意自己寫(xiě)的中間件,配置要寫(xiě)在系統(tǒng)中的后面
7、session存儲(chǔ)的相關(guān)配置
1)數(shù)據(jù)庫(kù)配置(默認(rèn))
Django默認(rèn)支持Session,并且默認(rèn)是將Session數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,即:django_session 表中。 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認(rèn)) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串(默認(rèn)) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認(rèn)) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認(rèn)) SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認(rèn)) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認(rèn)) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認(rèn)) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過(guò)期(默認(rèn)) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存(默認(rèn))
2)緩存配置
配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認(rèn)內(nèi)存緩存,也可以是memcache),此處別名依賴緩存的設(shè)置 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串 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 # 是否關(guān)閉瀏覽器使得Session過(guò)期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存
3)默認(rèn)配置
配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個(gè)臨時(shí)地址tempfile.gettempdir() SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串 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 # 是否關(guān)閉瀏覽器使得Session過(guò)期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存
注意:
1)也可以自定義配置 但是自定義的配置都要寫(xiě)到配置文件最后 代碼中使用時(shí)可以導(dǎo)入配置
from django.conf import settings settings.配置名
2)上面所有配置都是針對(duì)特定問(wèn)題需要修改的 系統(tǒng)默認(rèn)配置不做說(shuō)明
3)上面配置只是前面django系列隨筆所遇到的常用配置 后續(xù)所遇配置都會(huì)逐步在此隨筆中持續(xù)添加跟新
下面看段django settings最佳配置實(shí)例代碼,具體代碼如下所示:
# encoding=utf-8 import os import socket SITE_ID = 1 # 項(xiàng)目的根目錄 # 簡(jiǎn)化后面的操作 PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__)) # 加載應(yīng)用 # 把應(yīng)用添加到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 # 加載靜態(tài)文件 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 # 密鑰配置 # 適用于開(kāi)發(fā)環(huán)境和部署環(huán)境 # 可以從系統(tǒng)環(huán)境中,配置文件中,和硬編碼的配置中得到密鑰 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' # 得到主機(jī)名 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') #調(diào)試和模板調(diào)試配置 #主機(jī)名相同則為開(kāi)發(fā)環(huán)境,不同則為部署環(huán)境 #ALLOWED_HOSTS只在調(diào)試環(huán)境中才能為空 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 #數(shù)據(jù)庫(kù)配置 MYDB = { 'mysql': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'books', #你的數(shù)據(jù)庫(kù)名稱(chēng) 'USER': 'root', #你的數(shù)據(jù)庫(kù)用戶名 'PASSWORD': '', #你的數(shù)據(jù)庫(kù)密碼 'HOST': '', #你的數(shù)據(jù)庫(kù)主機(jī),留空默認(rèn)為localhost 'PORT': '3306', #你的數(shù)據(jù)庫(kù)端口 }, 'sqlite': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(PROJECT_ROOT, 'db/db.sqlite3').replace('\\', '/'), } } # 給靜態(tài)文件url一個(gè)后綴,在templates里用到的。 # 映射到靜態(tài)文件的url # STATIC_URL的含義與MEDIA_URL類(lèi)似 STATIC_URL = '/static/' # 總的static目錄 # 可以使用命令 manage.py collectstatic 自動(dòng)收集static文件 # STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static').replace('\\', '/') #放各個(gè)app的static目錄及公共的static目錄 #STATICFILES_DIRS:和TEMPLATE_DIRS的含義差不多,就是除了各個(gè)app的static目錄以外還需要管理的靜態(tài)文件設(shè)置, #比如項(xiàng)目的公共文件差不多。然后給靜態(tài)文件變量賦值,告訴Django,靜態(tài)文件在哪里 #另外,Django提供了一個(gè)findstatic命令來(lái)查找指定的靜態(tài)文件所在的目錄,例如:D:\TestDjango>python manage.py findstatic Chrome.jpg # 默認(rèn)情況下(如果沒(méi)有修改STATICFILES_FINDERS的話),Django首先會(huì)在STATICFILES_DIRS配置的文件夾中尋找靜態(tài)文件,然后再?gòu)拿總€(gè)app的static子目錄下查找, # 并且返回找到的第一個(gè)文件。所以我們可以將全局的靜態(tài)文件放在STATICFILES_DIRS配置的目錄中,將app獨(dú)有的靜態(tài)文件放在app的static子目錄中。 # 存放的時(shí)候按類(lèi)別存放在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中的靜態(tài)文件添加到靜態(tài)文件配置列表中 STATICFILES_DIRS += MY_STATIC_DIRS # 最后關(guān)鍵的部分是STATICFILES_DIRS以下配置 # 簡(jiǎn)要說(shuō)一下,static文件夾在項(xiàng)目里,有css js images 三個(gè)文件夾(看項(xiàng)目結(jié)構(gòu)),他們的路徑分別是: # os.path.join(STATIC_ROOT,'css'),os.path.join(STATIC_ROOT,'js'),os.path.join(STATIC_ROOT,'images'); # 我們分別給他們起三個(gè)別名css,js,images(你可以隨意給,不過(guò)為了易記,我們?cè)Q(chēng)指定別名了) TEMPLATE_DIRS = ( os.path.join(PROJECT_ROOT, 'templates').replace('\\', '/'), ) # 配置應(yīng)用的模板文件路徑 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/"),上傳的文件就會(huì)被保存到c:\temp\media\abc。MEDIA_ROOT必須是本地路徑的絕對(duì)路徑。 MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'static/uploads') # MEDIA_URL是指從瀏覽器訪問(wèn)時(shí)的地址前綴。 MEDIA_URL = '/uploads/' # 應(yīng)用注冊(cè)列表 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', ) #為了不和系統(tǒng)應(yīng)用混合,自己開(kāi)發(fā)的應(yīng)用放在這里 # 將自己寫(xiě)的app添加到應(yīng)用列表中去 INSTALLED_APPS += MY_APPS # django 中間件 # django處理一個(gè)Request的過(guò)程是首先通過(guò)django 中間件,然后再通過(guò)默認(rèn)的URL方式進(jìn)行的。 # 所以說(shuō)我們要做的就是在django 中間件這個(gè)地方把所有Request攔截住, # 用我們自己的方式完成處理以后直接返回Response,那么我們可以簡(jiǎn)化原來(lái)的設(shè)計(jì)思路, # 把中間件不能處理的 Request統(tǒng)統(tǒng)不管,丟給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' #數(shù)據(jù)庫(kù)配置 DATABASES = { 'default': MYDB.get('sqlite'), } # 語(yǔ)言 LANGUAGE_CODE = 'zh-cn' # 時(shí)區(qū) TIME_ZONE = 'Asia/Shanghai' USE_TZ = True # 在template中使用靜態(tài)文件 # 采用這種方式需要有一些額外配置,打開(kāi)settings.py,確認(rèn)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',自定義函數(shù) # ) #from django.conf import settings #gettext = lambda s: s #getattr() # 假設(shè)有個(gè)工程djangodemo,有兩個(gè)app為demo1跟demo2 # django處理static的方法是把各個(gè)app各自的static合并到一處 # 比如: # djangodemo/djangodemo/static 放置公共靜態(tài)文件 # djangodemo/demo1/static 放置該app自己的靜態(tài)文件 # djangodemo/demo2/static 放置該app自己的靜態(tài)文件 # 可以這么設(shè)置: # STATIC_ROOT = '/www/djangodemo/djangodemo/static ' # STATIC_URL = '/static/' # STATICFILES_DIRS = ( # 'djangodemo/static', # 'demo1/static/', # 'demo2/static/', # ) # 使用命令 # manage.py collectstatic # 就會(huì)自動(dòng)把所有靜態(tài)文件全部復(fù)制到STATIC_ROOT中 # 如果開(kāi)啟了admin,這一步是很必要的,不然部署到生產(chǎn)環(huán)境的時(shí)候會(huì)找不到樣式文件 # 不要把你項(xiàng)目的靜態(tài)文件放到這個(gè)目錄。這個(gè)目錄只有在運(yùn)行manage.py collectstatic時(shí)才會(huì)用到
總結(jié)
以上所述是小編給大家介紹的django中的setting最佳配置小結(jié),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Python實(shí)現(xiàn)九宮格式的朋友圈功能內(nèi)附“馬云”朋友圈
PIL(Python Imaging Library)是一個(gè)非常強(qiáng)大的Python庫(kù),但是它支持Python2.X, 在Python3中則使用的是Pillow庫(kù),它是從PIL中fork出來(lái)的一個(gè)分支。這篇文章主要介紹了用Python搞定九宮格式的朋友圈功能內(nèi)附“馬云”朋友圈 ,需要的朋友可以參考下2019-05-05python一鍵升級(jí)所有pip package的方法
下面小編就為大家?guī)?lái)一篇python一鍵升級(jí)所有pip package的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01對(duì)python調(diào)用RPC接口的實(shí)例詳解
今天小編就為大家分享一篇對(duì)python調(diào)用RPC接口的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01pytest fixtures裝飾器的使用和如何控制用例的執(zhí)行順序
這篇文章主要介紹了pytest fixtures裝飾器的使用和如何控制用例的執(zhí)行順序,幫助大家更好的理解和使用pytest測(cè)試框架,感興趣的朋友可以了解下2021-01-01python爬取網(wǎng)頁(yè)版QQ空間,生成各類(lèi)圖表
最近python課程學(xué)完了,琢磨著用python點(diǎn)什么東西,經(jīng)過(guò)一番搜索,盯上了QQ空間,本文主要講述了如何爬取網(wǎng)頁(yè)版QQ空間,并生成詞云圖、柱狀圖、折線圖、餅圖的各種示例代碼2021-06-06