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配置文件详解的更多相关文章

  1. Django settings.py 配置文件详解

    settings.py 配置文件 import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #引 ...

  2. setings.py配置文件详解

    BASE_DIR指的是项目的根目录.SECRET_KEY是安全码. # SECURITY WARNING: don't run with debug turned on in production! ...

  3. settings.xml配置文件详解

    简单值 一半顶层settings元素是简单值,它们表示的一系列值可以配置Maven的核心行为:settings.xml中的简单顶层元素 < settings xmlns="http:/ ...

  4. maven - settings.xml文件详解

    Settings.xml配置文件详解 maven默认的settings.xml是一个包含注释和例子的模板,可以快速的修改settings.xml文件 maven安装后不会在用户目录下自动生成setti ...

  5. WebConfig配置文件详解

    今天看到博客园一位朋友整理的一个WebConfig配置文件详解,觉得不错,转载一下: <?xml version="1.0"?> <!--注意: 除了手动编辑此文 ...

  6. (原创)LAMP搭建之二:apache配置文件详解(中英文对照版)

    LAMP搭建之二:apache配置文件详解(中英文对照版) # This is the main Apache server configuration file. It contains the # ...

  7. sqlMapConfig.xml配置文件详解

    sqlMapConfig.xml配置文件详解: Xml代码 Xml代码  <? xml version="1.0" encoding="UTF-8" ?& ...

  8. supervisor配置文件详解

    介绍 Supervisor是一个进程控制系统. 它是一个C/S系统(注意: 其提供WEB接口给用户查询和控制), 它允许用户去监控和控制在类UNIX系统的进程. 它的目标与launchd, daemo ...

  9. FastDFS分布式文件系统配置文件详解

    一.tracker配置文件详解: # is this config file disabled# false for enabled# true for disableddisabled=false# ...

随机推荐

  1. mysql在node中的一些操作

    mysql 服务: a) 安装wamp|xamp 开启 mysql服务 b) 安装mysql 开启服务 库操作: 客户端:软件操作(UI工具) wamp的客户端是phpmyadmin navicat ...

  2. win10下载

    Win10 简体中文正式版 微软MSDN官方ISO镜像下载(2020年1月21日更新) 官方地址:https://www.microsoft.com/zh-cn/software-download/w ...

  3. WAF的基础绕过

    方法分类: 1.HTTP参数污染绕过 2.HTTP Header头部欺骗绕过 3.HTTP参数溢出绕过 4.HTTP分块传输绕过 5.HTTP数据编码绕过 6.HTTP Pipline绕过(Keep- ...

  4. 【终端命令】组管理 和 Ubuntu中的"sudo"命令

    一.超级用户root 1.超级用户和标准用户 Linux系统中的root账户通常 用于系统的维护和管理,对操作系统的 所有资源 具有所有访问权限. 在大多数版本的Linux系统中,都 不推荐 直接使用 ...

  5. 卸载软件后,win10应用与功能中仍有残留,解决方案。

    这个问题我已经找到解决办法了,首先打开“应用和功能”列表, 然后往下拉看到“相关设置”打开其中的“程序和功能”一项, 然后找出你想删除的应用进行卸载.

  6. Linux分区类型EXT2、EXT3、EXT4详解

    一.EXT2与EXT3 Linux之前缺省情况下使用的文件系统为Ext2,ext2文件系统的确高效稳定.但是,随着Linux系统在关键业务中的应用,Linux文件系统的弱点也渐渐显露出来了:其中系统缺 ...

  7. oracle DB 使用注意点小结

    1.DDL 后不需要添加commit;语句,因为Oracle数据库的DDL不支持transaction,执行即commit: DDL(Data Definition Language): 数据定义语言 ...

  8. srpingboot web - 启动(3) 监听器

    接上一篇 一. getRunListeners() 在run() 方法中调用了 getRunListeners(args) 方法, 先看一下这个方法干了什么 private SpringApplica ...

  9. OpenCV基本绘图函数

    线段:line 函数 CV_EXPORTS_W void line(CV_IN_OUT Mat& img, Point pt1, Point pt2, const Scalar& co ...

  10. R 拼接结果展示

    学长教的拼接结果展示 哇,R 简直太有魅力了! 晚一点补充