0007 settings.py配置文件详解
01 DEBUG调试配置
开发期设置为True,发布时设置为False
02 INSTALLED_APPS已安装的APP配置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # drf 框架
'Applications.Organization.apps.OrganizationConfig', # Organization APP
'GeneralTools', # 常用工具
]
03 TEMPLATES模板配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'Applications/Organization/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',
],
},
},
]
04 设置数据库IP变量
MYSQL_SERVER = '49.235.156.156' REDIS_SERVER = '49.235.156.156' FDFS_SERVER = '49.235.156.156'
05 DATABASES数据库配置
05.1 sqlLite数据库配置(默认配置)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
05.2 mysql数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'yiwenzhen_db',
'USER': 'root',
'PASSWORD': 'ws$RV^TM0okm20200203',
'HOST': MYSQL_SERVER,
'PORT': '3306',
# 'OPTIONS': {
# "init_command": "SET sql_mode='STRICT_TRANS_TABLES'",
# }
}
}
05.3 redis数据库配置
# Redis 数据库
CACHES = {
# 缓存view数据
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://" + REDIS_SERVER + ":6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "1q2w3e",
}
},
# 缓存登录session
"session": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://" + REDIS_SERVER + ":6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "1q2w3e",
}
},
# 存放sms验证码
"sms_codes": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://" + REDIS_SERVER + ":6379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "1q2w3e",
}
}
}
# 修改了Django的Session机制使用redis保存,且使用名为'session'的redis配置。
# 此处修改Django的Session机制存储主要是为了给Admin站点使用。
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"
05.4 fastDFS数据库配置
# 覆盖Django默认指定的文件存储方式 DEFAULT_FILE_STORAGE = 'Tools.storage.FdfsStorage' # 自定义两个变量,分别表示client.conf文件的路径和fdfs的url FDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'Configurations', 'client.conf') FDFS_URL = 'http://' + FDFS_SERVER + ':80/'
06 日期语言设置
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
07 静态文件目录配置
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
08 自动生成日志配置
# 日志处理
LOGGING = {
'version': 1,
'disable_existing_loggers': False, # 是否禁用已经存在的日志器
'formatters': { # 日志信息显示的格式
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
},
},
'filters': { # 对日志进行过滤
'require_debug_true': { # django在debug模式下才输出日志
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': { # 日志处理方法
'console': { # 向终端中输出日志
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': { # 向文件中输出日志
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_DIR, 'config/yiwenzhen.log'), # 日志文件的位置
'maxBytes': 300 * 1024 * 1024,
'backupCount': 10,
'formatter': 'verbose'
},
},
'loggers': { # 日志器
'yiwenzhen': { # 定义了一个名为yiwenzhen的日志器
'handlers': ['console', 'file'], # 可以同时向终端与文件中输出日志
'propagate': True, # 是否继续传递日志信息
'level': 'INFO', # 日志器接收的最低日志级别
},
}
}
09 DRF配置
09.1 自定义异常类
DRF中可以自定义异常,在GeneralTools目录下创建一个文件Exceptions.py,自定义一个异常类:
from rest_framework.views import exception_handler as drf_exception_handler
import logging
from django.db import DatabaseError
from redis.exceptions import RedisError
from rest_framework.response import Response
from rest_framework import status
# 获取在配置文件中定义的logger,用来记录日志
logger = logging.getLogger('yiwenzhen')
def exception_handler(exc, context):
"""
自定义异常处理
:param exc: 异常
:param context: 抛出异常的上下文
:return: Response响应对象
"""
# 调用drf框架原生的异常处理方法
response = drf_exception_handler(exc, context)
if response is None:
view = context['view']
if isinstance(exc, DatabaseError) or isinstance(exc, RedisError):
# 数据库异常
logger.error('[%s] %s' % (view, exc))
response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
return response
09.2 把自定义异常类声明到DRF配置中
# REST配置
REST_FRAMEWORK = {
# JWT 认证
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # JWT认证
'rest_framework.authentication.SessionAuthentication', # session认证
'rest_framework.authentication.BasicAuthentication', # 基本认证
),
# 过滤Filtering
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
# 分页Pagination
# 也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明。
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 20, # 每页数目
# 异常处理(自定义异常)
'EXCEPTION_HANDLER': 'GeneralTools.Exceptions.exception_handler',
# 接口文档
# 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}
10 指定Django认证系统所使用的模型类
10.1 在GeneralTools下创建BaseModel.py文件
from django.db import models
class BaseModel(models.Model):
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间', help_text='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', help_text='更新时间')
class Meta:
# 说明这个类是一个抽象模型类,在迁移的时候不会生成表
abstract = True
10.2 打开Applications/Organization/models.py,创建一个模型
from django.db import models
from django.contrib.auth.models import AbstractUser
from GeneralTools.BaseModel import BaseModel
class User(AbstractUser, BaseModel):
openid = models.CharField(max_length=100, verbose_name='微信唯一标识', null=True, blank=True, help_text='openid')
mobile = models.CharField(max_length=20, verbose_name='手机', help_text='手机') # 手机是整个平台的通行证
identity = models.CharField(max_length=30, verbose_name='身份证号', default='', help_text='身份证号')
weixin = models.CharField(max_length=50, verbose_name='微信号', null=True, blank=True, help_text='微信号')
nickname = models.CharField(max_length=200, verbose_name='用户昵称', null=True, blank=True, help_text='用户昵称')
sexchoice = (
(1, '男'),
(2, '女'),
)
sex = models.IntegerField(choices=sexchoice, verbose_name='性别', null=True, blank=True, help_text='性别')
province = models.CharField(max_length=30, verbose_name='省', null=True, blank=True, help_text='省')
language = models.CharField(max_length=100, verbose_name='语言', null=True, blank=True, help_text='语言')
city = models.CharField(max_length=30, verbose_name='市', null=True, blank=True, help_text='市(地级市)')
country = models.CharField(max_length=30, verbose_name='县', null=True, blank=True, help_text='县(县级市)')
headimgurl = models.CharField(max_length=300, verbose_name='微信头像路径', null=True, blank=True, help_text='微信头像路径')
unionid = models.CharField(max_length=100, verbose_name='unionid', null=True, blank=True, help_text='unionid')
subscribe_scene = models.CharField(max_length=50, verbose_name='用户关注的渠道来源', null=True, blank=True,
help_text='用户关注的渠道来源')
class Meta:
db_table = 'UserInfo'
verbose_name_plural = '001 用户信息表'
10.3 在settings.py文件后面增加
AUTH_USER_MODEL = 'Organization.UserInfo'
10.4 执行数据迁移
(venv) D:\DjangoDevelopment\projects\Tongheng2>python manage.py makemigrations
Migrations for 'Organization':
Applications\Organization\migrations\0001_initial.py
- Create model UserInfo
(venv) D:\DjangoDevelopment\projects\Tongheng2>python manage.py migrate
Operations to perform:
Apply all migrations: Organization, admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying Organization.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying sessions.0001_initial... OK
(venv) D:\DjangoDevelopment\projects\Tongheng2>
11 设置跨域CORS白名单
# 跨域CORS白名单
CORS_ORIGIN_WHITELIST = (
'http://127.0.0.1:80',
'http://127.0.0.1:8000',
)
CORS_ALLOW_CREDENTIALS = True # 允许携带cookie
12 JWT配置
# JWT 配置
JWT_AUTH = {
# 设置生成(签发)jwt token时token有效时间
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
# 指定JWT 扩展登录视图生成响应数据调用函数
'JWT_RESPONSE_PAYLOAD_HANDLER': 'Apps.OrgsAndUsers.utils.jwt_response_payload_handler'
}
13 JWT生成响应数据函数
13.1 在Organization目录下创建文件utils.py
import logging
# 获取在配置文件中定义的logger,用来记录日志
logger = logging.getLogger('tongheng2')
def jwt_response_payload_handler(token, user=None, request=None):
"""
自定义jwt登录视图响应数据
"""
return {
'id': user.id,
'name': user.name,
'photo_url': user.photo_url,
'role_flag': user.role_flag,
'mobile': user.mobile,
'openid': user.openid,
'token': token
}
13.2 在settings.py增加配置
# JWT 配置
JWT_AUTH = {
# 设置生成(签发)jwt token时token有效时间
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
# 指定JWT 扩展登录视图生成响应数据调用函数
'JWT_RESPONSE_PAYLOAD_HANDLER': 'Applications.Organization.utils.jwt_response_payload_handler'
}
14 指定Django认证系统后端类,用于验证登录
14.1 打开Organization目录下创建文件utils.py,增加内容:
import re
from django.contrib.auth.backends import ModelBackend
import logging
from Applications.Organization.models import UserInfo
# 获取在配置文件中定义的logger,用来记录日志
logger = logging.getLogger('tongheng2')
def jwt_response_payload_handler(token, user=None, request=None):
"""
自定义jwt登录视图响应数据
"""
return {
'id': user.id,
'name': user.name,
'photo_url': user.photo_url,
'role_flag': user.role_flag,
'mobile': user.mobile,
'openid': user.openid,
'token': token
}
class UsernameMobileAuthBackend(ModelBackend):
"""
自定义Django认证系统后端类
"""
def authenticate(self, request, username=None, password=None, **kwargs):
"""
username: 可能是手机号或微信openID
根据手机号登录,就需要验证密码
根据openID登录,不需要验证密码,随便输入一个密码即可
"""
try:
if re.match(r'^1[3-9]\d{9}$', username):
# 根据手机号查询用户
user = UserInfo.objects.get(mobile=username)
# 如果用户存在,检验密码是否正确
if user is not None and user.check_password(password):
return user
else:
user = None
else:
# 根据微信openID查询用户
user = UserInfo.objects.get(openid=username)
# 如果用户存在,检验密码是否正确
if user is not None:
return user
else:
user = None
except UserInfo.DoesNotExist:
user = None
return user
14.2 在settings.py中增加配置
# 指定Django认证系统后端类,支持用户名或手机号登录
AUTHENTICATION_BACKENDS = [
# 'Apps.OrgsAndUsers.utils.UsernameMobileAuthBackend'
]
15 DRF扩展
# DRF扩展
REST_FRAMEWORK_EXTENSIONS = {
# 缓存时间,单位秒(24小时)
'DEFAULT_CACHE_RESPONSE_TIMEOUT': 24 * 60 * 60,
# 缓存存储
'DEFAULT_USE_CACHE': 'default',
}
0007 settings.py配置文件详解的更多相关文章
- Django settings.py 配置文件详解
settings.py 配置文件 import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #引 ...
- setings.py配置文件详解
BASE_DIR指的是项目的根目录.SECRET_KEY是安全码. # SECURITY WARNING: don't run with debug turned on in production! ...
- settings.xml配置文件详解
简单值 一半顶层settings元素是简单值,它们表示的一系列值可以配置Maven的核心行为:settings.xml中的简单顶层元素 < settings xmlns="http:/ ...
- maven - settings.xml文件详解
Settings.xml配置文件详解 maven默认的settings.xml是一个包含注释和例子的模板,可以快速的修改settings.xml文件 maven安装后不会在用户目录下自动生成setti ...
- WebConfig配置文件详解
今天看到博客园一位朋友整理的一个WebConfig配置文件详解,觉得不错,转载一下: <?xml version="1.0"?> <!--注意: 除了手动编辑此文 ...
- (原创)LAMP搭建之二:apache配置文件详解(中英文对照版)
LAMP搭建之二:apache配置文件详解(中英文对照版) # This is the main Apache server configuration file. It contains the # ...
- sqlMapConfig.xml配置文件详解
sqlMapConfig.xml配置文件详解: Xml代码 Xml代码 <? xml version="1.0" encoding="UTF-8" ?& ...
- supervisor配置文件详解
介绍 Supervisor是一个进程控制系统. 它是一个C/S系统(注意: 其提供WEB接口给用户查询和控制), 它允许用户去监控和控制在类UNIX系统的进程. 它的目标与launchd, daemo ...
- FastDFS分布式文件系统配置文件详解
一.tracker配置文件详解: # is this config file disabled# false for enabled# true for disableddisabled=false# ...
随机推荐
- postgresql开篇
postgresql 作为官方号称的最先进的开源数据库,从今天(2020-1-19)起开始系统的学习一下,记录自己学习的点点滴滴.
- tomcat虚拟路径的配置方法
方式一: 将web项目配置到webapps以外的目录 在conf/server.xml中配置,找到<host>标签,<Content docBase="E:\yqs\Jsp ...
- Angular修改Port文件一览
\protractor.conf.js\README.md\node_modules\angular-cli\README.md\node_modules\angular-cli\blueprints ...
- egg 提交数据 防csrf 攻击 配置
await ctx.render('from',{csrf:this.ctx.csrf}); 或者 使用中间件 ctx.state.csrf = ctx.csrf;
- 在写论文的参考文献时,有的段落空格很大,有的段落则正常,原因及解决方法(wps)
下图是一段原始的参考文献,可以看出第一行的空格很大: 原因: 当一个词占不下时,自动将单词移动到下一行,但是这一行又有很多字符,因此这时,软件会将空闲的位置用空白字符填满.第一行有两个空白字符,因此将 ...
- MySQL 8 服务器日志
错误日志: 启动.运行.停止 mysqld(MySQL Server) 遇到的问题 通用查询日志: 建立客户端连接和从客户端接收的语句 二进制日志: 更改数据的语句(也用于复制) 中继日志: 从复制m ...
- 【database】复制表数据到相同备份表
目的及由来,因为数据库表都采取逻辑删除isDeleted=true/flase,但是之前有些报表或者其他的sql并没有在sql中指明此条件.为了不影响之前代码,所以: 1.数据库中创建一张相同的表,把 ...
- shelll高级编程【实战】(1)
shell优势在于处理操作系统底层业务,2000多个命令都是shell的支持. 一键安装,报警脚本,常规业务操作,shell开发更简单快速. 1- 常用操作系统默认shell linux: Bourn ...
- 每个Web开发者都应该知道的SOLID原则
面向对象的编程并不能防止难以理解或不可维护的程序.因此,Robert C. Martin 制定了五项指导原则,使开发人员很容易创建出可读性强且可维护的程序.这五项原则被称为 S.O.L.I.D 原则. ...
- Python机器学习及实践 课后小题
目录 第二章 2.3章末小结 @(Python机器学习及实践-----从零开始通往Kaggle竞赛之路) 第二章 2.3章末小结 1 机器学习模型按照使用的数据类型,可分为监督学习和无监督学习两大类. ...