内置认证类、权限类、频率类
1.内置认证类
BasicAuthentication:基本认证方式我们不用
RemoteUserAuthentication:服务器设置REMOTE_USER环境变量,也不用(了解)
SessionAuthentication:用session认证登陆,登陆了在request.userz中就有当前登陆用户(后期也不会使用)
TokenAuthentication:使用token认证方式,但我们自己写
ps:dif内置的认证类与我们项目不贴合所以一般我们不用,我们根据自己的要求自己写
2.内置权限类
BasePermission:所有的基类
AllowAny:允许所有
IsAuthenticated:是否登陆,登陆了才有权限
IsAdminUser:auth的user表中is_staff字段是否为True来判断对后台管理有没有权限
3.内置频率类
BaseThrottle:所有对基类
SimpleRateThrottle:我们自己写的评率类都继承它
AnonRateThrottle:按照ip地址来限制,在配置文件中再配置
REST_FRAMEWORK={ 'DEFAULT_THROTTLE_RATES': { 'anon': '3/m', } }
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.完整的接口文档包含以下
请求地址(URL)
请求方式:GET、POST、PUT、DELETE、PATCH、UPDATE
请求头:通常用来传递一些参数,如果没有也可以省略
请求参数:get、post参数
返回格式示例
2.多种方式写接口文档
1)直接使用word或md写接口文档
2)使用接口文档平台,在接口文档平台录入
自己搭建Yapi,百度开源需要自己搭建
第三方的平台(需要收费)
自己开发接口文档平台
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', }