电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

django rest framework 自定義返回方式

瀏覽:142日期:2024-09-27 09:20:56

大家在用Django Rest Framework的時候會發(fā)現(xiàn)默認(rèn)繼承后,增刪改查的返回信息都是一段data,這是因為我實際是狀態(tài)碼和信息你在調(diào)用api的時候是看不到的,僅僅如此么?并不是這樣,在我前端調(diào)用后端的時候,實際上相關(guān)的code和msg是能看得到的,但是我們在普通的調(diào)用api他只是單單的返回data信息,這個是不夠我們滿足需求的,畢竟我們不僅僅需要用前端需調(diào)用,下面我們來自定義Response返回信息

Django(2.0)

Django Rest Framework

Python3.6

1、自定義Response,繼承rest framework的Response

#這個方法py文件我們可以寫到任意地方,目的是在我們需要寫一個Baseview的時候?qū)⒎呕胤椒ㄒ胒rom django.utils import sixfrom rest_framework.response import Responsefrom rest_framework.serializers import Serializerclass JsonResponse(Response): ''' An HttpResponse that allows its data to be rendered into arbitrary media types. ''' def __init__(self, data=None, code=None, msg=None, status=None, template_name=None, headers=None, exception=False, content_type=None): ''' Alters the init arguments slightly. For example, drop ’template_name’, and instead use ’data’. Setting ’renderer’ and ’media_type’ will typically be deferred, For example being set automatically by the `APIView`. ''' super(Response, self).__init__(None, status=status) if isinstance(data, Serializer): msg = ( ’You passed a Serializer instance as data, but ’ ’probably meant to pass serialized `.data` or ’ ’`.error`. representation.’ ) raise AssertionError(msg) self.data = {'code': code, 'message': msg, 'data': data} self.template_name = template_name self.exception = exception self.content_type = content_type if headers: for name, value in six.iteritems(headers): self[name] = value

2、重寫B(tài)ase類,將增刪改查方法重寫并且返回方法為剛剛定義好的新的Response類

#Base類,將增刪改查方法重寫#!/usr/bin/env python# -*- coding:utf-8 -*-from assets import serializersfrom assets import modelsfrom rest_framework.response import Responsefrom rest_framework import statusfrom rest_framework import viewsetsfrom rest_framework.decorators import actionfrom rest_framework.pagination import PageNumberPaginationfrom django.shortcuts import get_object_or_404from common.utils.custom_response import JsonResponsefrom rest_framework import filtersfrom django_filters import rest_frameworkfrom django_filters.rest_framework import DjangoFilterBackendclass CustomViewBase(viewsets.ModelViewSet): # pagination_class = LargeResultsSetPagination # filter_class = ServerFilter queryset = ’’ serializer_class = ’’ permission_classes = () filter_fields = () search_fields = () filter_backends = (rest_framework.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter,) def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return JsonResponse(data=serializer.data,msg='success',code=201,status=status.HTTP_201_CREATED,headers=headers) def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return JsonResponse(data=serializer.data,code=200,msg='success',status=status.HTTP_200_OK) def retrieve(self, request, *args, **kwargs): instance = self.get_object() serializer = self.get_serializer(instance) return JsonResponse(data=serializer.data,code=200,msg='success',status=status.HTTP_200_OK) def update(self, request, *args, **kwargs): 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 JsonResponse(data=serializer.data,msg='success',code=200,status=status.HTTP_200_OK) def destroy(self, request, *args, **kwargs): instance = self.get_object() self.perform_destroy(instance) return JsonResponse(data=[],code=204,msg='delete resource success',status=status.HTTP_204_NO_CONTENT)

3、view視圖繼承以及測試

class BatchLoadView(CustomViewBase): queryset = models.Manufacturer.objects.all() serializer_class = serializers.ManufacturerSerializer def list(self, request, *args, **kwargs): return JsonResponse(code=200, data=[], msg='testings')

這樣我們就完成了自定義返回信息,下一節(jié)將講解自定義異常

補充知識:django rest framework 自定義異常返回

上一節(jié)給大家介紹了自定義Response返回信息,但那個只用于正確的返回success,但是當(dāng)我們用到了權(quán)限

auth 401、方法不允許method 405,等等,這時候我們就用自己自定義異常返回信息

1、定義settings配置文件

#定義異常返回的路徑腳本位置REST_FRAMEWORK = { ’EXCEPTION_HANDLER’: ’common.utils.custom_execption.custom_exception_handler’,}

2、定義腳本

#注意,腳本路徑需要與settings.py 定義的一樣from rest_framework.views import exception_handlerdef custom_exception_handler(exc, context): # Call REST framework’s default exception handler first, # to get the standard error response. response = exception_handler(exc, context) # Now add the HTTP status code to the response. if response is not None: print(response.data) response.data.clear() response.data[’code’] = response.status_code response.data[’data’] = [] if response.status_code == 404: try:response.data[’message’] = response.data.pop(’detail’)response.data[’message’] = 'Not found' except KeyError:response.data[’message’] = 'Not found' if response.status_code == 400: response.data[’message’] = ’Input error’ elif response.status_code == 401: response.data[’message’] = 'Auth failed' elif response.status_code >= 500: response.data[’message’] = 'Internal service errors' elif response.status_code == 403: response.data[’message’] = 'Access denied' elif response.status_code == 405: response.data[’message’] = ’Request method error’ return response#無需調(diào)用,報錯的時候他自己會調(diào)用!!

以上這篇django rest framework 自定義返回方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 南京泽朗生物科技有限公司 | 变色龙云 - 打包app_原生app_在线制作平台_短链接_ip查询 | 刚性-柔性防水套管-橡胶伸缩接头-波纹管补偿器-启腾供水材料有限公司 | 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 飞行者联盟-飞机模拟机_无人机_低空经济_航空技术交流平台 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | 长沙网站建设制作「网站优化推广」-网页设计公司-速马科技官网 | 数显恒温培养摇床-卧式/台式恒温培养摇床|朗越仪器 | 迪威娱乐|迪威娱乐客服|18183620002 | 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 小型UV打印机-UV平板打印机-大型uv打印机-UV打印机源头厂家 |松普集团 | 山东聚盛新型材料有限公司-纳米防腐隔热彩铝板和纳米防腐隔热板以及钛锡板、PVDF氟膜板供应商 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 合肥展厅设计-安徽展台设计-合肥展览公司-安徽奥美展览工程有限公司 | 污水提升器,污水提升泵,地下室排水,增压泵,雨水泵,智能供排水控制器-上海智流泵业有限公司 | 中国玩具展_玩具展|幼教用品展|幼教展|幼教装备展 | 广州印刷厂_广州彩印厂-广州艺彩印务有限公司 | 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 塑胶地板-商用PVC地板-pvc地板革-安耐宝pvc塑胶地板厂家 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 合肥卓创建筑装饰,专业办公室装饰、商业空间装修与设计。 | 选矿设备,选矿生产线,选矿工艺,选矿技术-昆明昆重矿山机械 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 房在线-免费房产管理系统软件-二手房中介房屋房源管理系统软件 | 广州网站建设_小程序开发_番禺网站建设_佛山网站建设_粤联网络 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 据信,上课带着跳 D 体验-别样的课堂刺激感受引发网友热议 | SMC-ASCO-CKD气缸-FESTO-MAC电磁阀-上海天筹自动化设备官网 | 烟气换热器_GGH烟气换热器_空气预热器_高温气气换热器-青岛康景辉 | 专注氟塑料泵_衬氟泵_磁力泵_卧龙泵阀_化工泵专业品牌 - 梭川泵阀 | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 膜结构停车棚-自行车棚-膜结构汽车棚加工安装厂家幸福膜结构 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 印刷人才网 印刷、包装、造纸,中国80%的印刷企业人才招聘选印刷人才网! | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 澳威全屋定制官网|极简衣柜十大品牌|衣柜加盟代理|全屋定制招商 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 |