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文件的访问权限,在共享主机的情况下,这一点格外重要。

基础

  1. **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级别日志通过Handlers

  • Formatters
    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存储配置

  1. 数据库配置(默认)
    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,默认修改之后才保存(默认)
    
  1. 缓存配置
    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为空时,将验证主机。