0010 Django工程配置(07 REST_FRAMEWORK配置)

DRF有丰富的功能,JWT认证、过滤、分页、异常处理、接口文档、限流、缓存等。

这些配置,有些需要写自定义接口,有些只需要配置就可以了。

1 在INSTALLED_APPS中,增加两个应用

INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘rest_framework‘,  # djangorestframework框架
    ‘django_filters‘,
    # 增加其它应用       
]

2 编写自定义异常

在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(‘tongheng2‘)


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

3 增加REST_FRAMEWORK配置

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‘: 10,  # 每页数目

    # 异常处理(自定义异常)
    ‘EXCEPTION_HANDLER‘: ‘GeneralTools.Exceptions.exception_handler‘,

    # 接口文档
    # ‘DEFAULT_SCHEMA_CLASS‘: ‘rest_framework.schemas.AutoSchema‘,
    ‘DEFAULT_SCHEMA_CLASS‘: ‘rest_framework.schemas.coreapi.AutoSchema‘,
    # 限流
    ‘DEFAULT_THROTTLE_CLASSES‘: (
        # ‘rest_framework.throttling.AnonRateThrottle‘, # 限制所有匿名未认证用户
        # ‘rest_framework.throttling.UserRateThrottle‘, # 限制所有用户
        ‘rest_framework.throttling.ScopedRateThrottle‘,  # 限制用户对每个视图的访问频次
    ),
    ‘DEFAULT_THROTTLE_RATES‘: {
        # ‘anon‘: ‘1/minute‘,
        # ‘user‘: ‘1/minute‘  # 限制用户对所有接口访问频次
        ‘org_home‘: ‘1/minute‘  # 限制匿名用户或注册用户对接口的访问频次
    }
}

4 指定JWT认证返回数据格式

在GeneralTools目录下创建JwtHandler.py文件,内容如下:

import logging

# 获取在配置文件中定义的logger,用来记录日志
# 注:其中的tongheng2必须和配置文件中指定的配置路径一致。
logger = logging.getLogger(‘tongheng2‘)


def jwt_response_payload_handler(token, user=None, request=None):
    """
    【功能描述】直接使用DRF-JWT提供的视图方法时,其默认的返回值只有token,若需要前端接收到用户其它信息,
    需要重写jwt_response_payload_handler方法。
    """

    return {
        ‘id‘: user.id,
        ‘username‘: user.username,
        ‘photo_url‘: user.photo_url,
        ‘mobile‘: user.mobile,
        ‘openid‘: user.openid,
        ‘token‘: token
    }

5 增加JWT_AUTH配置

JWT_AUTH = {
    # 设置生成(签发)jwt token时token有效时间
    ‘JWT_EXPIRATION_DELTA‘: datetime.timedelta(days=1),

    # 指定JWT 扩展登录视图生成响应数据调用函数
    ‘JWT_RESPONSE_PAYLOAD_HANDLER‘:
        ‘GeneralTools.JwtHandler.jwt_response_payload_handler‘
}

6 增加DRF扩展配置

REST_FRAMEWORK_EXTENSIONS = {
    # 缓存时间,单位秒(24小时)
    ‘DEFAULT_CACHE_RESPONSE_TIMEOUT‘: 24 * 60 * 60,
    # 缓存存储
    ‘DEFAULT_USE_CACHE‘: ‘default‘,
}

相关推荐