当前位置: 首页 > news >正文

网站备案 免费免费找客源软件

网站备案 免费,免费找客源软件,html免费网站模板,厦门市政府网站建设在当今快速发展的Web开发领域,Django REST Framework(DRF)以其强大的功能和灵活性成为了众多开发者的首选。然而,错误的使用方法不仅会导致项目进度延误,还可能影响性能和安全性。本文将从我个人本身遇到的相关坑来给大…

在当今快速发展的Web开发领域,Django REST Framework(DRF)以其强大的功能和灵活性成为了众多开发者的首选。然而,错误的使用方法不仅会导致项目进度延误,还可能影响性能和安全性。本文将从我个人本身遇到的相关坑来给大家避坑。
在这里插入图片描述

一、API性能优化

坑:响应太慢!!!!!!

import os
from django_filters.rest_framework import DjangoFilterBackendfrom rest_framework import viewsets
from rest_framework import filters
from rest_framework import permissions, authentication
from rest_framework.decorators import action
from rest_framework_simplejwt.authentication import JWTAuthenticationfrom utils.rest_framework_util.pagination import CommonPagination
from utils.rest_framework_util.response import rtn_success_info, rtn_error_info
from utils.rest_framework_util.excel_util import ExcelUtil, write_excel_file
from utils.utils import get_current_time_format
from utils.oss.tx_upload import CommonUpload
from drf_yasg import openapi__all__ = {"CommonViewSet","CommonUserViewSet"
}from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapiclass CommonViewSet(viewsets.ModelViewSet):permission_classes = ()authentication_classes = ()filter_backends = [ DjangoFilterBackend, filters.SearchFilter]search_fields = ["id"]save_export_folder = "static/save_export/"pagination_class = CommonPaginationdef list(self, request, *args, **kwargs):queryset = self.filter_queryset(self.get_queryset())len_model = len(queryset)page = self.paginate_queryset(queryset)if page is not None:serializer = self.get_serializer(page, many=True)response_data = {"total": len_model,"list": serializer.data}return rtn_success_info(response_data, msg="查询数据成功")serializer = self.get_serializer(queryset, many=True)return rtn_success_info(serializer.data)def retrieve(self, request, *args, **kwargs):instance = self.get_object()serializer = self.get_serializer(instance)return rtn_success_info(serializer.data)def update(self, request, *args, **kwargs):"""put 修改"""try:partial = kwargs.pop('partial', False)instance = self.get_object()serializer = self.get_serializer(instance, data=request.data, partial=partial)serializer.is_valid(raise_exception=True)self.perform_update(serializer)if getattr(instance, '_prefetched_objects_cache', None):# If 'prefetch_related' has been applied to a queryset, we need to# forcibly invalidate the prefetch cache on the instance.instance._prefetched_objects_cache = {}return rtn_success_info(serializer.data, msg='修改数据成功')except Exception as e:return rtn_error_info(msg=e)def destroy(self, request, *args, **kwargs):instance = self.get_object()self.perform_destroy(instance)return rtn_success_info(msg="数据删除成功")def perform_destroy(self, instance):instance.delete()def create(self, request, *args, **kwargs):serializer = self.get_serializer(data=request.data)serializer.is_valid(raise_exception=True)self.perform_create(serializer)return rtn_success_info(serializer.data, msg="创建数据成功")@action(detail=False, methods=['POST'])def data_import(self, request, *args, **kwargs):response_data_list = []file = request.FILES.get("file", None)if file is None:return rtn_error_info("需要传入file文件")else:title_list, data_list = ExcelUtil(file).read_data()serializer_class = self.get_serializer_class()model = serializer_class.Meta.modeltry:if model is not None:model.objects.create()for create_data in data_list:response_data = {}for index_, title in enumerate(title_list):response_data[title] = create_data[index_]if response_data.get('id', None) is not None:response_data.pop("id")serializer = self.get_serializer(data=response_data)if serializer.is_valid():# 创建self.perform_create(serializer)except Exception as e:return rtn_error_info(f"数据导入失败:{e}")response_data_list = data_listreturn rtn_success_info(data=response_data_list, msg='导入数据成功')@action(detail=False, methods=['POST'])def data_export(self, request, *args, **kwargs):id_list = request.data.get('ids', None)queryset = self.get_queryset()row_data_list = []is_first = Falsetitle_list = []title = ""for data in queryset:title = data.__class__.__name__if not is_first:data_list = []for data_meta in data._meta.fields:data_list.append(data_meta.name)title_list.append(data_meta.name)row_data_list.append(data_list)  # titleis_first = Truebreakfor value_data in queryset.values():data_info = []if id_list is not None:for id_ in id_list:if int(value_data['id']) == int(id_):for title in title_list:data_info.append(value_data[title])else:for title in title_list:data_info.append(value_data[title])if len(data_info) > 0:row_data_list.append(data_info)excel_file_name = f"{title}_{get_current_time_format('%Y_%m_%d_%H_%M_%S')}.xlsx"if not os.path.exists(self.save_export_folder):os.makedirs(self.save_export_folder)write_excel_file(row_data_list, f"{self.save_export_folder}{excel_file_name}")if os.path.exists(f"{self.save_export_folder}{excel_file_name}"):url = CommonUpload().cos_upload_file(f"{self.save_export_folder}{excel_file_name}")data = {'excel_url': url}return rtn_success_info(data, '导出成功')return rtn_error_info("导出失败")class CommonUserViewSet(CommonViewSet):"""带用户权限的ViewSetArgs:viewsets (_type_): _description_Returns:_type_: _description_"""permission_classes = [permissions.IsAuthenticated]authentication_classes = [JWTAuthentication, authentication.SessionAuthentication,authentication.BasicAuthentication]def create(self, request, *args, **kwargs):data = request.datadata["user"] = request.user.idserializer = self.get_serializer(data=data)serializer.is_valid(raise_exception=True)self.perform_create(serializer)return rtn_success_info(serializer.data, msg="创建数据成功")def list(self, request, *args, **kwargs):queryset = self.filter_queryset(self.get_queryset())len_model = len(queryset)page = self.paginate_queryset(queryset)if page is not None:serializer = self.get_serializer(page, many=True)response_data = {"total": len_model,"list": serializer.data}return rtn_success_info(response_data, msg="查询数据成功")serializer = self.get_serializer(queryset, many=True)return rtn_success_info(serializer.data)

以这块代码为例,大家会发现一个问题,虽然都封装了ViewSet,但是他的响应速度比之前慢很多,原因何在,问题就出现在len_model = len(queryset)上,因为当前的len(queryset)会遍历每一个model,导致性能缓慢,正确的修改方式是使用queryset.count(),会大幅度的提高性能,直接获取里面的变量。
图片

二、复杂权限管理
针对于这类的权限管理,其实DRF也给咱们弄好了,但是基于实际业务场景的复杂性,本人也提供给大家一个参考的可定制化的代码!
1.通过定制通用类的permissions

class CommonUserViewSet(CommonViewSet):"""带用户权限的ViewSetArgs:viewsets (_type_): _description_Returns:_type_: _description_"""permission_classes = [permissions.IsAuthenticated]authentication_classes = [JWTAuthentication, authentication.SessionAuthentication,authentication.BasicAuthentication]``
类似这个,这个是用于基础的认证,比方说用户需要登陆才能确认的,使用这个比较方便。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/07b878dcf2d641b79e9700d6a8ade683.png)2.特定用户
这类的需求,可以通过获取self.request.user来判断,其中可以通过获取用户是否为超级用户,以及username等判断,大大提高drf的灵活性!![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8ddab551e10942f7a1b7ebc0d0dd9686.png)最后,大家还遇到哪些坑,也可以分享在评论区中,大家一起排雷,祝大家春节喜乐!觉得有用的话可以分享以及关注哈!

文章转载自:
http://lusaka.ncmj.cn
http://overroof.ncmj.cn
http://foundry.ncmj.cn
http://scenical.ncmj.cn
http://yestermorning.ncmj.cn
http://dionysian.ncmj.cn
http://multinuclear.ncmj.cn
http://application.ncmj.cn
http://individually.ncmj.cn
http://kob.ncmj.cn
http://deme.ncmj.cn
http://baryon.ncmj.cn
http://nulliparous.ncmj.cn
http://polished.ncmj.cn
http://sinecure.ncmj.cn
http://provision.ncmj.cn
http://gunfignt.ncmj.cn
http://debtor.ncmj.cn
http://yarmouth.ncmj.cn
http://fantoccini.ncmj.cn
http://misanthropy.ncmj.cn
http://tracheal.ncmj.cn
http://decelerate.ncmj.cn
http://percher.ncmj.cn
http://insurrectionary.ncmj.cn
http://antipathetic.ncmj.cn
http://yh.ncmj.cn
http://selfishly.ncmj.cn
http://prajna.ncmj.cn
http://ymha.ncmj.cn
http://gammasonde.ncmj.cn
http://zeugmatic.ncmj.cn
http://animatism.ncmj.cn
http://conveyance.ncmj.cn
http://circulation.ncmj.cn
http://wormless.ncmj.cn
http://glomerulus.ncmj.cn
http://pavilion.ncmj.cn
http://adulation.ncmj.cn
http://jammy.ncmj.cn
http://transshape.ncmj.cn
http://timberhead.ncmj.cn
http://featherwitted.ncmj.cn
http://wrongly.ncmj.cn
http://capibara.ncmj.cn
http://tzarevich.ncmj.cn
http://venereology.ncmj.cn
http://leisuresuit.ncmj.cn
http://visard.ncmj.cn
http://gridder.ncmj.cn
http://endure.ncmj.cn
http://tarim.ncmj.cn
http://semibrachiator.ncmj.cn
http://crabhole.ncmj.cn
http://didact.ncmj.cn
http://nickeliferous.ncmj.cn
http://isolated.ncmj.cn
http://tasmanian.ncmj.cn
http://malocclusion.ncmj.cn
http://exhaustless.ncmj.cn
http://efficacious.ncmj.cn
http://lymphadenoma.ncmj.cn
http://limitary.ncmj.cn
http://mar.ncmj.cn
http://bvm.ncmj.cn
http://euthermic.ncmj.cn
http://emetic.ncmj.cn
http://stickup.ncmj.cn
http://saccharomyces.ncmj.cn
http://dickens.ncmj.cn
http://undulate.ncmj.cn
http://dismissal.ncmj.cn
http://affrontedness.ncmj.cn
http://natruresis.ncmj.cn
http://petechiate.ncmj.cn
http://nodose.ncmj.cn
http://volcanology.ncmj.cn
http://polysulphide.ncmj.cn
http://iterative.ncmj.cn
http://leggy.ncmj.cn
http://adrenocorticosteroid.ncmj.cn
http://dimensionality.ncmj.cn
http://darhan.ncmj.cn
http://resalable.ncmj.cn
http://agnean.ncmj.cn
http://unrwa.ncmj.cn
http://radiotherapy.ncmj.cn
http://wader.ncmj.cn
http://indemnificatory.ncmj.cn
http://maidan.ncmj.cn
http://frederic.ncmj.cn
http://communize.ncmj.cn
http://trouvaille.ncmj.cn
http://salangane.ncmj.cn
http://soya.ncmj.cn
http://incrust.ncmj.cn
http://gms.ncmj.cn
http://rmt.ncmj.cn
http://graze.ncmj.cn
http://handleability.ncmj.cn
http://www.dt0577.cn/news/100449.html

相关文章:

  • 网站建设与小程序开发熊掌号广州网站设计
  • wordpress主题测试网站seo推广方案
  • crm软件系统 运用广州推动优化防控措施落地
  • b2c网站框架百度文库账号登录入口
  • 天津塘沽网站建设公司手机百度快照
  • 石英手表网站陕西seo顾问服务
  • 新手卖家做来赞达网站如何新版阿里指数官网
  • 做理论的网站已矣seo排名点击软件
  • 万网网站域名长春网站优化咨询
  • 科技袁人巩义网站推广优化
  • 惠州市住房和城乡建设厅网站外链推广网站
  • 西安网站建设APP开发如何推广网上国网
  • 100个免费推广网站下载文件外链网站
  • 摄影网站设计说明全网搜索软件下载
  • 小程序商城哪家好经销商seo优化工作有哪些
  • 做新闻网站编辑需要什么大的网站建设公司
  • 做的好的h游戏下载网站网络营销的八种方式
  • 网站空间制作网站自然排名怎么优化
  • 乐清网站制作公司哪家好今日国内重大新闻事件
  • 北京网站设计价格出词
  • 小甲鱼网站开发全国疫情最新情况最新消息今天
  • 长沙手机网站建设哪些内容短视频如何引流与推广
  • 百盛联合建设集团网站搜索引擎排行榜
  • 网站内页没有排名重庆seo扣费
  • 中国志愿者服务网站登录注册百度流量推广项目
  • 莱芜新站优化百度seo排名公司
  • 洛阳做网站故事性营销软文
  • php做的网站出现404网络推广网站的方法
  • 有啥创意可以做商务网站的免费发布信息网
  • 在一呼百应上做网站行吗网络营销属于什么专业类型