Django settings详解

Django settings详解css

1.基础python

DJANGO_SETTING_MODULE环境变量:让settings模块被包含到python能够找到的目录下,开发状况下不须要,咱们一般会在当前文件夹运行,python能够搜索到。若是须要运行在其余服务器上,就必须指定DJANGO_SETTINGS_MODULE变量。mysql

2.默认设定sql

一个django的settings文件不须要咱们手动去设置全部项目,由于系统已经默认设置好了。咱们只须要修改咱们使用的设数据库

定就行了。默认的设置在django/conf/global_settings.py文件中。django在编译时,先载入global_settings.py中的配置,而后加载指定的settings文件,重写改变的设定。django

好了,步入正文。浏览器

前面的随笔中咱们常常会改setting配置也常常将一些配置混淆今天主要是将一些常见的配置作一个汇总。缓存

setting配置汇总服务器

一、app路径cookie

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'
  # 新建的应用都要在这里添加
]

二、数据库配置

若是使用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

三、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语句在服务端打印。

四、静态文件目录

1
2
3
4
STATIC_URL =  '/static/'  #调用时目录
STATICFILES_DIRS = [
  os.path.join(BASE_DIR, "static" ), #具体路径
]

五、若是数据库中的UserInfo(用户表)继承django内置AbstractUser

1)model需导入

1
from  django.contrib.auth.models import  AbstractUser

2)配置文件

1
AUTH_USER_MODEL =  "应用名.UserInfo"

六、中间件

本身写的中间件,例如在项目中的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' ,
]

注意本身写的中间件,配置要写在系统中的后面

七、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时才会用到