dif内置三大认证类与全局异常、API接口文档

内置认证类、权限类、频率类

1.内置认证类

        \bullet BasicAuthentication:基本认证方式我们不用

        \bullet RemoteUserAuthentication:服务器设置REMOTE_USER环境变量,也不用(了解)

        \bullet SessionAuthentication:用session认证登陆,登陆了在request.userz中就有当前登陆用户(后期也不会使用)

        \bullet TokenAuthentication:使用token认证方式,但我们自己写

ps:dif内置的认证类与我们项目不贴合所以一般我们不用,我们根据自己的要求自己写

2.内置权限类

        \bullet BasePermission:所有的基类

        \bullet AllowAny:允许所有

        \bullet IsAuthenticated:是否登陆,登陆了才有权限

        \bullet IsAdminUser:auth的user表中is_staff字段是否为True来判断对后台管理有没有权限

3.内置频率类

        \bullet BaseThrottle:所有对基类

        \bullet SimpleRateThrottle:我们自己写的评率类都继承它

        \bullet AnonRateThrottle:按照ip地址来限制,在配置文件中再配置

REST_FRAMEWORK={
    'DEFAULT_THROTTLE_RATES': {
        'anon': '3/m',
    }
}

        \bullet UserRateThrottle:按照用户id限制,在配置文件中配置

REST_FRAMEWORK={
    'DEFAULT_THROTTLE_RATES': {
        'user': '3/m',
    }
}

过滤类的其它使用

        DIF中内置的过滤类只能通过:?search=搜索条件,这种方式来搜索不能精准的指定如果我们需要精准的指定字段的话可以通过第三方过滤类或者自己自定义

1.第三方过滤类

第一步:按照第三方模块 

pip3 install django-filter

第二步:在视图类中配置

from django_filters.rest_framework import DjangoFilterBackend
# 导入第三方过滤类
class BookView(ViewSetMixin, ListAPIView, CreateModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    # 指定过滤类
    filter_backends = [DjangoFilterBackend, ]
    # 指定过滤字段:精准匹配 (/books/?name=程序&perce=66) 
    filterset_fields = ['name','perce']

第三步:前端访问形式

GET http://127.0.0.1:8000/books/?name=程序&perce=66
# 精准搜索条件间是并且的关系

2.自定义过滤类

第一步:写一个类继承BaseFilterBackend

class CsFilter(BaseFilterBackend):
    # 重写某个方法

第二步:重写filter_queryset方法

class CsFilter(BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        # 在这里面实现过滤,一定要返回qs对象,过滤后的数据
        name = request.query_params.get('name', None)
        price = request.query_params.get('price', None)
        qs = queryset.filter(name__icontains=name, price__icontains=price)
        return qs

第三步:配置在视图类中

from .filter import CsFilter

class BookView(ViewSetMixin, ListAPIView, CreateModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    # 指定自定义的过滤类
    filter_backends = [CsFilter,]

第四步:前端访问形式

GET http://127.0.0.1:8000/books/?name=程序&perce=66
# 精准搜索条件间是并且的关系

ps:多个过滤类和排序类是可以共用的,在视图类的filter_backends=[],可以配置多个,执行顺序是从左往右,因此最左边的要尽可能的先过滤掉大部分数据

全局异常处理

在dif中无论在三大认证还是视图类的方法中执行,只要报错或主动抛出异常都会执行一个函数来处理异常,我们可以自己写一个异常处理函数配置在配置文件中这样以后出了异常处理完后返回的就是我们指定的返回格式

使用方式:

第一步:新建一个py文件重写common_exception_handler方法

from rest_framework.views import exception_handler
from rest_framework.response import Response
import time

def common_exception_handler(exc,context):
    request = context.get('request')
    try:
        # 获取登陆用户后面写在日志中需要,取不到抛用户未登录
        username = request.user.username
    except:
        username = '没有登陆'
    # 获取抛异常的时间,哪个接口,什么请求到时候记入到日志中
    ctime = time.time()
    path = request.path
    method_type = request.method
    # 内置的异常处理函数只处理了dif自己的异常
    request = exception_handler(exc,context)
    # 如果response有值说明dif错误被处理了
    if response:
        return Response({'code':101,'msg': 'drf错误原因是:%s' % response.data.get('detail', '未知错误')})
    # 返回none说明错误没有被处理,这个错误不是dif的错误而是django或代码的错误
    else:
        return Response({'code': 999, 'msg': '系统错误,错误原因是:%s' % str(exc)})

第二步:在配置文件中配置

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'app01.exctptions.common_exception_handler'
    }

接口文档

当我们写完接口后前端需要用我们的接口来进行访问,但是前端工程师不知道你这个接口的请求方式、地址等等。所以我们需要给每个接口写一个接口文档来说明接口的信息

1.完整的接口文档包含以下

        \bullet 请求地址(URL)

        \bullet 请求方式:GET、POST、PUT、DELETE、PATCH、UPDATE

        \bullet 请求头:通常用来传递一些参数,如果没有也可以省略

        \bullet 请求参数:get、post参数

        \bullet 返回格式示例

2.多种方式写接口文档

1)直接使用word或md写接口文档

2)使用接口文档平台,在接口文档平台录入

        \bullet 自己搭建Yapi,百度开源需要自己搭建

        \bullet 第三方的平台(需要收费)

        \bullet 自己开发接口文档平台

3)项目自动生成,借助第三方模块

第一步:下载第三方模块

pip3 install coreapi
pip3 install swagger

第二步:在路由中进行配置

from rest_framework.documentation import include_docs_urls

urlpatterns = [
            path('docs/', include_docs_urls(title='站点页面标题'))
]

第三步:在序列化类中写上help_text

from .models import Book
from rest_framework import serializers

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = "__all__"
        extra_kwargs={'name':{'help_text':'图书名'}}

第四步:在视图类中加注释

class BookView(ViewSetMixin, ListAPIView, CreateModelMixin):
    """
    list:
        返回所有图书信息.

   create:
        新建图书.
    """
    queryset = Book.objects.all()
    serializer_class = BookSerializer

第五步:在配置文件中配置

REST_FRAMEWORK = {
         'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值