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# ...
随机推荐
- 【Java】简易Socket连接实现
客户端: import java.io.*; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.D ...
- JAVA JDBC 连接数据库
方式一 Driver driver = new com.mysql.jdbc.Driver(); String url = "jdbc:mysql://localhost:3306/test ...
- C# MVC Api无法获得参数
在MVC中写API时,没有收到参数如何解决? 通过jQuery.POST测试成功.后来又通过F12发送,发现始终无法收到参数. 注:我的接口接收参数是一个类对象,没有写[FromBody]) [Htt ...
- js获取时间及转化
有关Javascript的本地时间获取,下面我直接用代码来进行举例吧 let time = new Date(); let month = time.getMonth()+1; //获取的月份0~11 ...
- Python的基本语法和数据类型(简明教程)
声明:借鉴Python 简明教程 一.注释 注释: 就是对代码的解释 方便大家阅读python代码,在编辑器中快捷键: notepad :ctrl + q pycharm: ctrl + / ...
- Python的入门级试用(简明教程)
声明:借鉴Python 简明教程 用 Python 编写的传统的 'Hello World' 程序.使用 Python 运行你的程序的方法有两种:使用交互式解释器提示符或者使用源文件.现在我们来看一下 ...
- SecureCRT 按退格键出现 ^H 的解决办法
问题如图 打开SecureCRT 界面,最上方工具栏 1.选项→会话选项 2.终端→仿真→映射键 3.其他选项→勾选 Backspace 发送 delete(B) 4.点击确定即可 另外在不可编辑状态 ...
- MySQL8服务无法正常启动的解决方法(1053错误)
个人博客 地址:https://www.wenhaofan.com/article/20190530120545 错误描述 在MySQL安装的最后一步启动失败,如下图所示 在服务和应用程序->服 ...
- ZedGraph5.1.5源码分析去掉鼠标悬浮内容闪烁问题(附源码下载)
场景 在使用ZedGraph绘制曲线图时,将鼠标悬浮时内容闪烁,且频率很高. 找到其源码,发现不论鼠标移动的范围大小,甚至乎不论鼠标是否移动,都要刷新一次Tooltip. 注: 博客主页:https: ...
- youhua