rest_framework07:权限/频率/过滤组件/排序/异常处理封装Response对象

权限

写一个类,继承BasePermission,如果通过返回True,否则False

这里需要配合认证使用,否则没有user_type属性。

from rest_framework.permissions import BasePermission

class UserPermission(BasePermission):
    def has_permission(self, request, view):
        # 不是超级用户不能访问
        # 如果认证已经通过了, request 内勇敢有user对象。
        # 当前登录用户
        user = request.user
        if user.user_type == 1:
            return True
        else:
            return False

局部使用

在视图类添加

class TestView(APIView):
    permission_classes = [app_auth.UserPermission]

全局使用

在配置文件添加

REST_FRAMEWORK={
    'DEFAULT_PERMISSION_CLASSES':['app_authentication.app_auth.UserPermission',]
}

局部禁用

class TestView(APIView):
    permission_classes = []

内置频率

全局配置

未登录用户限制

REST_FRAMEWORK={

    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '3/m',
    }

过滤组件

组件是django的,放在rest framework使用

1.安装

pip install django-filter

2.注册

INSTALLED_APPS = [
    ...
    'django_filters',  # 需要注册应用,
]

3.配置

全局配置为例

REST_FRAMEWORK = {
    ...
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
from rest_framework.generics import ListAPIView
from app01.models import Book
from app_authentication.ser import BookModelSerializer

class BookView(ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer
    filter_fields = ('name', 'price')

访问:http://127.0.0.1:8000/app_authentication/bookview/?price=22.10

排序

from rest_framework.filters import OrderingFilter
class Book2View(ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer
    # 如果有局部过滤功能,在列表添加
    filter_backends = [OrderingFilter]
    ordering_fields=('id','price')

访问:

倒序:http://127.0.0.1:8000/app_authentication/book2view/?ordering=-price

正序:http://127.0.0.1:8000/app_authentication/book2view/?ordering=price

异常处理

1.统一抛出固定格式错误信息

2.记日志

自定义异常方法,替换全局使用

# 自定义异常
from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status
def my_exception_handler(exc,context):
    response=exception_handler(exc,context)
    # response 两种情况
    # None drf 没有处理
    # Response 对象,django处理,但不符合需求
    print(type(exc))

    if not response: # 非空
        if isinstance(exc,ZeroDivisionError):
            return Response(data={'status':777,'msg':'除以0错误'+str(exc)},status=status.HTTP_400_BAD_REQUEST)
        return Response(data={'status': 999, 'msg':  str(exc)}, status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response(data={'status': 888, 'msg': response.data.get('detail')}, status=status.HTTP_400_BAD_REQUEST)
    
    

settings.py

REST_FRAMEWORK={
   ...
    'EXCEPTION_HANDLER':'app_authentication.app_auth.my_exception_handler'
}

封装Response对象

class APIResponse(Response):
    def __init__(self,code=100,msg='成功',data=None,status=None,headers=None,**kwargs):
        dic={'code':code,'msg':msg}
        if data:
            dic={'code':code,'msg':msg,'data':data}
        # 可以多添加参数
        dic.update(kwargs)
        super().__init__(data=dic,status=status,headers=headers)

使用

from app_authentication.app_auth import APIResponse
class TestView4(APIView):
    def get(self,request,*args,**kwargs):
        return APIResponse(data={"nane":'abc'},token="sldjfl",aa="123123")


#  return APIResponse(data={"nane":'abc'})
#  return APIResponse(token="sldjfl",aa="123123")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
帮我把下列代码的case后内容和 “nStepMode =” 后的内容进行调换 switch (nThirdStepMode) { case PM_UNKNOWN_MODE: { // 无法识别的第三方工步号 return false; } break; case PM_STEP_REST: { nStepMode = WORK_HOLD; } break; case PM_STEP_RANDOM_REST: { nStepMode = WORK_HOLD_RANDOM; } break; case PM_STEP_SYN_SUSPEND: { // 无法识别的第三方工步号 return false; } break; case PM_STEP_PAUSE: { nStepMode = WORK_PAUSE; } break; case PM_STEP_STOP_X: { // 无法识别的第三方工步号 return false; } break; case PM_CONST_POWER_CHARGE: { nStepMode = WORK_CP; } break; case PM_CONST_POWER_DISCHARGE: { nStepMode = WORK_DP; } break; case PM_CONST_RESISTANCE_CHARGE: { nStepMode = WORK_CR; } break; case PM_CONST_RESISTANCE_DISCHARGE: { nStepMode = WORK_DR; } break; case PM_STEP_INCUBATOR_LINK: { // TODO:处理 温箱联动 return false; } break; case PM_CONST_CURRENT_CHARGE: { nStepMode = WORK_CC; } break; case PM_CONST_CURRENT_DISCHARGE: { nStepMode = WORK_DC; } break; case PM_STEP_C_RATE_CHARGE: { nStepMode = WORK_CRATE; } break; case PM_STEP_C_RATE_DISCHARGE: { nStepMode = WORK_DRATE; } break; case PM_STEP_CCCV_CHARGE: // carefully! { nStepMode = WORK_CCCV; } break; case PM_STEP_CCCV_DISCHARGE: // carefully! { nStepMode = WORK_DCDV; } break; case PM_CONST_VOLT_CHARGE: { nStepMode = WORK_CV; } break; case PM_CONST_VOLT_DISCHARGE: // support lmtPara from V7206 { nStepMode = WORK_DV; } break; case PM_STEP_RATE_CV_CHARGE: { nStepMode = WORK_CRATECV; } break; case PM_STEP_RATE_CV_DISCHARGE: { nStepMode = WORK_DRATEDV; } break; case PM_STEP_CPCV_CHARGE: { nStepMode = WORK_CPCV; } break; case PM_STEP_CPCV_DISCHARGE: { nStepMode = WORK_DPDV; } break; case PM_STEP_LOOP: { nStepMode = WORK_WHILE; } break; default: { // 无法识别的第三方工步号 return false; } break; }
05-29

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值