Django Setting.py详解
介绍
在创建Django项目后,会在根模块中生成一个setting.py配置文件,包含了Django安装的所有配置
特性
- 配置项
settings.py配置文件中的所有配置项都是大写的。 - 默认值
settings.py在项目创建时,就初始化了一些默认配置,这些默认配置承载着最基础的项目信息。 - 配置规则
可以从global_settings.py中导入全局配置,常规情况下,这是不必要的,在配置过程中,我们可以随时通过 python manage.py diffsettings 来查看当前settings文件和默认设置的不同之处。
可以通过 django.conf.settings 模块中导入变量,在代码中访问配置信息,这样的话,就可以在程序运行过程中进行动态的settings配置修改。 - 安全性
对于settings文件包含的信息,涉密的情况很多,需要严格控制settings.py文件的访问权限,在共享主机的情况下,这一点格外重要。
基础
**DJANGO_SETTING_MODULE**环境变量:让settings模块被包含到python可以找到的目录下,开发情况下不需要,我们通常会在当前文件夹运行,python可以搜索到。如果需要运行在其他服务器上,就必须指定**DJANGO_SETTING_MODULE**变量。
默认设定
setting.py默认在模块下,django在编译时,先载入**django/conf/global_settings.py**文件的配置,然后加载指定的setting文件,根据需要覆盖全局设置。
Setting.py解析
App载入
INSTALLED_APPS = [
'django.contrib.admin', # 管理员站点
'django.contrib.auth', # 认证授权系统
'django.contrib.contenttypes', # 内容类型框架
'django.contrib.sessions', # 会话框架
'django.contrib.messages', # 消息框架
'django.contrib.staticfiles', # 静态文件框架
# 上面是Django默认生成的,只需添加自己创建的app即可。
'myApp',
]
数据库配置
如果使用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': 'db_myapp',
'USER': 'uospuser',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
ENGINE支持的可选值
- django.db.backends.sqlite3
- django.db.backends.postgresql
- django.db.backends.mysql
- django.db.backends.oracle
日志配置
可以使用LOGGING配置django日志输出情况,LOGGING配置由四部分组成。
Loggers
可以有多个Loggers
Loggers向应用程序提供日志接口,每个loggers都是一个日志存储器,可以将日志消息写入进行处理。包含以下几个级别:- DEBUG:用于调试目的的低级系统信息
- INFO:一般系统信息
- WARNING:描述已发生的小问题的信息。
- ERROR:描述已发生的主要问题的信息。
- CRITICAL:描述已发生的严重问题的信息。
Handlers
Handlers是将接收到的log记录发送到指定的目的地(控制台、写入文件、网络套接字),与Loggers一样,Handlers也具有日志级别,如果loggers记录的日志未达到或超过Handlers的级别,将被忽略。
可以有多个Handlers,一个Loggers可以有多个Handlers,每个Handlers可以具有不同的日志级别。这样可以根据消息的重要性提供不同形式的通知。例如:可以创建一个Handlers将级别为ERROR和CRITICAL的消息发送到邮件通知,第二个Handlers将所有的消息(包含ERROR和CRITICAL)记录到文件中供以后分析Filters
对于从Loggers传递到Handlers的日志可以通过Filters进行额外的控制。
默认情况下,所有满足日志级别的日志都将被处理,通过Filters,可以添加其他控制条件,例如:可以只允许ERROR级别日志通过HandlersFormatters
Formatters为最终呈现出的格式。
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'}
},
'filters': {
},
'handlers': {
# 将日志输出到控制台
'console': {
# 只接收DEBUG以上级别的日志
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'standard' # 使用standard的formatters格式
},
# 将日志输出到文件
'file': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': './logs/pwdManager.log',
# 单个日志文件大小,超过后会自动切割
'maxBytes': 1024*1024*5,
# 最大历史文件个数
'backupCount': 5,
'formatter': 'standard',
},
},
'loggers': {
'pwdManager': {
# 同时输出到控制台和文件,便于调试
'handlers': ['file', 'console'],
'level': 'DEBUG',
'propagate': False,
},
}
}
使用Loggers
logger实例调用每个级别的使用方法:
- logger.debug()
- logger.info()
- logger.warning()
- logger.error()
- logger.critical()
还有另外两个日志记录调用:
- logger.log():手动发出具有特定日志级别的日志消息。
- logger.exception():创建
ERROR包装当前异常堆栈帧的级别日志记录消息。
# import the logging library
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
def my_view(request, arg1, arg):
...
if bad_mojo:
# Log an error message
logger.error('Something went wrong!')
每次bad_mojo激活条件时,都会写入错误日志记录。
静态文件和模版文件目录
static下存放静态文件,默认情况下(如果没有修改STATICFILES_FINDERS的话),Django首先会在STATICFILES_DIRS配置的文件夹中寻找静态文件,然后再从每个app的static子目录下查找
STATIC_URL = '/static/' #调用时目录
STATICFILES_DIRS=[
os.path.join(BASE_DIR,"static"), #具体路径
]
templates下存放网页模板文件
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [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',
],
},
},
]
为增强可移植性,在模板中可以用STATIC_URL来代替具体的/static/来设置资源路径,但是需要在settings.py中2个地方进行设置,否则会发生取不到资源的错误:
INSTALLED_APPS 中,加入 ‘django.contrib.staticfiles’,
TEMPLATES 中,context_processors中,加入django.template.context_processors.static
模板中调用时:
<img src="{{STATIC_URL}}pic.jpg " />
session存储配置
- 数据库配置(默认)
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。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,默认修改之后才保存(默认)
- 缓存配置
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,默认修改之后才保存
语言和时区配置
默认配置
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
修改为中文编码
LANGUAGE_CODE = 'zh-CN'
TIME_ZONE = 'Asia/Shanghai'
ALLOWED_HOSTS
ALLOWED_HOSTS是为了限定请求中的host值,以防止黑客构造包来发送请求。只有在列表中的host才能访问。
同时支持IP和域名的形式,例如:[‘localhost’, ‘www.aa.com’, 127.0.0.1’, ‘[::1]’],
可以通过ALLOW_HOSTS = [‘*’] 来允许所有的,但不建议。
当DEBUG为True和ALLOWED_HOSTS为空时,将验证主机。
