首页 > 其他分享 >django-drf 全局封装

django-drf 全局封装

时间:2024-05-15 19:59:15浏览次数:21  
标签:封装 name request django kwargs return view data drf

封装全局异常

common_exceptions.py

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

def common_exception_handler(exc, context):
      # 记录日志
    request = context.get('request')
    view = context.get('view')
    ip = request.META.get('REMOTE_ADDR')
    path = request.get_full_path()
    method = request.method
    user_id = request.user.id or '【匿名用户】'
    logger.error(
        f'操作出错:{str(exc)},ip地址为:{ip},请求方式是:{method},请求地址是:{path},用户为:{user_id},视图类为:{str(view)}')
    
    view_name =view.__class__.__name__
    response = exception_handler(exc, context)
    if response:
        if isinstance(response.data,list):
            err=response.data[0]
        elif isinstance(response.data, dict):
            err = response.data.get('detail', f'{view_name}视图出错了,错误信息:系统错误,请联系系统管理员')
        else:
            err='系统错误,请联系系统管理员'
        return Response({'code':901,'msg': f'{view_name}视图出错了,drf的异常:{err}'})
    else:
        if isinstance(exc,ZeroDivisionError):
            return Response({'code':950,'msg': f'{view_name}视图出错了,错误信息:不能除以0'})
        elif isinstance(exc, TypeError):
            return Response({'code':951,'msg': f'{view_name}视图出错了,错误信息:类型错误,不同类型不能操作'})
        elif isinstance(exc, KeyError):
            return Response({'code': 952, 'msg': f'{view_name}视图出错了,错误信息:字典键错误,不存在键'})
        elif isinstance(exc, ValueError):
            return Response({'code': 953, 'msg': f'{view_name}视图出错了,错误信息:值错误,类型不对'})
        elif isinstance(exc, NameError):
            return Response({'code': 954, 'msg': f'{view_name}视图出错了,错误信息:变量名错误,变量未被定义'})
        elif isinstance(exc, IndexError):
            return Response({'code': 956, 'msg': f'{view_name}视图出错了,错误信息:索引错误,超出范围'})
        else:
            return Response({'code': 957, 'msg': f'{view_name}视图出错了,错误信息:其他错误'})

setting.py

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.common_exceptions.exception_handler',
}

封装Response

common_response.py

from rest_framework.response import Response

class APIResponse(Response):

    def __init__(self,code=100,msg='成功', status=None, headers=None, **kwargs):
        data={'code':code,'msg':msg}
        if kwargs:
            data.update(kwargs)
         		      super().__init__(data=data,status=status,headers=headers)

封装model

common_model.py

from django.db import models

class BaseModel(models.Model):
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    updated_time = models.DateTimeField(auto_now=True, verbose_name='最后更新时间')
    is_delete = models.BooleanField(default=False, verbose_name='是否删除')
    is_show = models.BooleanField(default=True, verbose_name='是否上架')
    orders = models.IntegerField(verbose_name='优先级')

    class Meta:
        abstract = True  # 只用来继承,不在数据库中生成表

封装 五个视图子类

common_mixin.py

from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin

from utils.common_response import APIResponse


class APIListModelMixin(ListModelMixin):
    def list(self, request, *args, **kwargs):
        res = super().list(request, *args, **kwargs)
        return APIResponse(results=res.data)

class APICreateModelMixin(CreateModelMixin):
    def create(self, request, *args, **kwargs):
        res = super().create(request, *args, **kwargs)
        return APIResponse(data=res.data)

class APIRetrieveModelMixin(RetrieveModelMixin):
    def retrieve(self, request, *args, **kwargs):
        res = super().retrieve(request, *args, **kwargs)
        return APIResponse(data=res.data)

class APIDestroyModelMixin(DestroyModelMixin):
    def destroy(self, request, *args, **kwargs):
        res = super().destroy(request, *args, **kwargs)
        return APIResponse(data=res.data)

class APIUpdateModelMixin(UpdateModelMixin):
    def update(self, request, *args, **kwargs):
        res = super().update(request, *args, **kwargs)
        return APIResponse(data=res.data)

标签:封装,name,request,django,kwargs,return,view,data,drf
From: https://www.cnblogs.com/unrealqcc/p/18194581

相关文章

  • django中使用redis
    django中使用redis方式一:通用方式pool.pyimportredisPOOL=redis.ConnectionPool(max_connections=10,decode_responses=True)在哪里用,导入用即可fromutils.poolimportPOOLimportredisclassRedisView(ViewSet):deflist(self,request):conn=......
  • drf之视图类
    drf视图组件类一、两个视图基类【1】继承APIView+序列化类+Response写接口views视图层classBookView(APIView):defget(self,request):book_list=Book.objects.all()ser=BookSerializer(book_list,many=True)returnResponse(ser.da......
  • drf之请求和响应
    drf之请求和响应一、drf之请求【1】源码分析#Request类的对象fromrest_framework.requestimportRequest#1新的request#2request.data前端传入的请求体中得数据,无论那种编码#3用起来跟之前一样#4老的request在request._request【2】配置视图类能处理的编......
  • drf之路由
    drf之路由1.SimpleRouter###自动生成路由#1导入一个路由类fromrest_framework.routersimportSimpleRouter#2实例化得到对象router=SimpleRouter()#3执行对象的方法router.register('books',BookView,'books')#4对象.属性拿到值print(router.urls)urlpatter......
  • 02快速上手drf、CBV源码分析、APIVIEW源码分析
    快速上手drf、CBV源码分析、APiview源码分析一、快速上手drf【1】安装drfpipinstalldjangorestframework注意:安装时不指定版本,默认下载最新版本每个版本有对应的解释器版本和django限制要求,下载时官网查看一下如果django版本是3以下,drf最新跟django3以下版本不兼容版......
  • 03请求数据封装request、版本管理
    请求数据封装request、版本管理一、请求数据再封装以前我们通过django开发项目时,视图中的request是django.core.handlers.wsgi.WSGIRequest类的对象,其中包含了请求相关的所有数据。而在使用drf框架时,视图中的request是rest_framework.request.Request类的对象,其是又对dja......
  • C++封装dll(__cdecl和__stdcall)
    【1】使用__stdcall还需要添加def文件编译,使用工具DEPENDS.EXE打开dll文件成功。【2】使用__cdecl直接编译即可,不需要导入def文件......
  • 【django学习-24】自定义插件
    1.ModelForm可以帮助我们生成HTML标签,这种是普通的标签classUserModelForm(forms.ModelForm):classMeta:model=models.UserInfofields=["name","password",]form=UserModelForm()2.如果我们要使用bootstrap的标签,该怎么操作呢?2.1:自定义......
  • django启动时执行某个操作数据库的方法怎么实现
    为了让django启动时就执行某些方法做了如下尝试一、在Django中,可以通过AppConfig类的ready()方法来实现在Django启动时执行某个方法。首先,在你的应用的apps.py文件中,创建一个继承自AppConfig类的子类,并重写ready()方法。例如,假设你的应用名为myapp,则可以创建一个MyAppConfig类:......
  • Django RESTful API设计与实践指南
    title:DjangoRESTfulAPI设计与实践指南date:2024/5/1415:37:45updated:2024/5/1415:37:45categories:后端开发tags:DjangoRESTAPI设计版本控制安全认证性能优化部署策略实战项目第1章:Django基础知识1.1Django简介:Django是一个使用Python语言开发......