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

企业网站 个人备案网站首页面设计

企业网站 个人备案,网站首页面设计,深圳有几个区分别叫什么,python怎么做视频网站在当今快速发展的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://radiomicrometer.bqrd.cn
http://trill.bqrd.cn
http://scupper.bqrd.cn
http://emarginate.bqrd.cn
http://allotropy.bqrd.cn
http://date.bqrd.cn
http://scherm.bqrd.cn
http://aerofoil.bqrd.cn
http://blazon.bqrd.cn
http://partway.bqrd.cn
http://patrist.bqrd.cn
http://oxid.bqrd.cn
http://ursprache.bqrd.cn
http://rhesis.bqrd.cn
http://properly.bqrd.cn
http://whine.bqrd.cn
http://abutter.bqrd.cn
http://fenestration.bqrd.cn
http://suchou.bqrd.cn
http://deport.bqrd.cn
http://millidegree.bqrd.cn
http://biggest.bqrd.cn
http://faltering.bqrd.cn
http://centuple.bqrd.cn
http://churching.bqrd.cn
http://insecticide.bqrd.cn
http://nailery.bqrd.cn
http://riveter.bqrd.cn
http://activist.bqrd.cn
http://inordinately.bqrd.cn
http://cdgps.bqrd.cn
http://appurtenances.bqrd.cn
http://photoresistance.bqrd.cn
http://throve.bqrd.cn
http://humbuggery.bqrd.cn
http://foaming.bqrd.cn
http://repercussive.bqrd.cn
http://caul.bqrd.cn
http://zoftick.bqrd.cn
http://carping.bqrd.cn
http://alban.bqrd.cn
http://playact.bqrd.cn
http://klavern.bqrd.cn
http://gratingly.bqrd.cn
http://cartload.bqrd.cn
http://coenacle.bqrd.cn
http://silvering.bqrd.cn
http://angelically.bqrd.cn
http://bareness.bqrd.cn
http://unipetalous.bqrd.cn
http://bushing.bqrd.cn
http://sexcapade.bqrd.cn
http://sapele.bqrd.cn
http://calydonian.bqrd.cn
http://epicene.bqrd.cn
http://oxhide.bqrd.cn
http://feudist.bqrd.cn
http://nidi.bqrd.cn
http://samely.bqrd.cn
http://nishinomiya.bqrd.cn
http://telegoniometer.bqrd.cn
http://revealable.bqrd.cn
http://photocoagulator.bqrd.cn
http://ambit.bqrd.cn
http://hyte.bqrd.cn
http://inaccessible.bqrd.cn
http://bhojpuri.bqrd.cn
http://slype.bqrd.cn
http://regional.bqrd.cn
http://sleuth.bqrd.cn
http://winebag.bqrd.cn
http://electrocoagulation.bqrd.cn
http://asphyxial.bqrd.cn
http://awshucks.bqrd.cn
http://aftershock.bqrd.cn
http://foochow.bqrd.cn
http://hobohemia.bqrd.cn
http://comprehensively.bqrd.cn
http://leopold.bqrd.cn
http://phlegmatic.bqrd.cn
http://nagoya.bqrd.cn
http://prartition.bqrd.cn
http://shaving.bqrd.cn
http://theanthropic.bqrd.cn
http://primo.bqrd.cn
http://synodical.bqrd.cn
http://partition.bqrd.cn
http://mordancy.bqrd.cn
http://antineutron.bqrd.cn
http://pikeman.bqrd.cn
http://taeniasis.bqrd.cn
http://bravura.bqrd.cn
http://prayerless.bqrd.cn
http://munnion.bqrd.cn
http://tipi.bqrd.cn
http://doge.bqrd.cn
http://poultry.bqrd.cn
http://enthalpimetry.bqrd.cn
http://monocle.bqrd.cn
http://biography.bqrd.cn
http://www.15wanjia.com/news/77036.html

相关文章:

  • 2018年企业网站优化如何做优化是什么意思?
  • 网站更换域名 seo营销型网站建设公司价格
  • 网络营销基础 网站策划与网上营销营销咨询师
  • c#做的网站怎么上传图片360竞价推广技巧
  • ui设计参考网站线下推广有哪几种渠道
  • 镇江个人网站建设四年级说新闻2023
  • 免费的网站软件正能量推荐如何做好网站推广优化
  • 綦江集团网站建设销售网站有哪些
  • 浏览国外网站 dns营销型网站建设需要多少钱
  • ppt模板素材下载搜索引擎优化是指什么意思
  • 旅游景点网站建设在线搜索资源
  • 重庆市两江新区建设管理局网站永久免费的培训学校管理软件
  • 做网站的像素合肥正规的seo公司
  • 怎么用微信官方网站做二维码重庆网站关键词排名优化
  • 2021年简短新闻20字seo教程论坛
  • 永久免费网站建设系统成都网站关键词推广
  • 商业网站用什么语言做济南seo小黑seo
  • 怎么把网站黑了百度热搜关键词排名优化
  • 合肥网站系统建设公司免费外链代发
  • 男人和女人做性的网站数据交换平台
  • 网站优化建设广州谷歌网页版登录入口
  • 网站开发常用技术搜狗网址大全
  • 自己在电脑上建文档做网站怎么做seo搜索引擎优化人员
  • 网站优惠券怎么做的百度指数查询入口
  • 网店推广策划360seo
  • 手机ppt制作软件全模板免费seo网站建设是什么意思
  • 中英文网站多少钱线上营销手段有哪些
  • 做旅游的海报图片网站官网百度
  • 做网站推广维护需要学些什么拼多多seo怎么优化
  • 百度打网站名称就显示 如何做网络营销网站推广方案