最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django rest framework 自定義返回方式

 更新時(shí)間:2020年07月12日 08:50:50   作者:小恩阿  
這篇文章主要介紹了django rest framework 自定義返回方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

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

Django(2.0)

Django Rest Framework

Python3.6

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

#這個(gè)方法py文件我們可以寫到任意地方,目的是在我們需要寫一個(gè)Baseview的時(shí)候?qū)⒎呕胤椒ㄒ?

from django.utils import six
from rest_framework.response import Response
from rest_framework.serializers import Serializer

class 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 serializers
from assets import models
from rest_framework.response import Response
from rest_framework import status
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.pagination import PageNumberPagination
from django.shortcuts import get_object_or_404
from common.utils.custom_response import JsonResponse
from rest_framework import filters
from django_filters import rest_framework
from django_filters.rest_framework import DjangoFilterBackend

class 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視圖繼承以及測(cè)試

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é)將講解自定義異常

補(bǔ)充知識(shí):django rest framework 自定義異常返回

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

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

1、定義settings配置文件

#定義異常返回的路徑腳本位置

REST_FRAMEWORK = {
  'EXCEPTION_HANDLER': 'common.utils.custom_execption.custom_exception_handler',
}

2、定義腳本

#注意,腳本路徑需要與settings.py 定義的一樣

from rest_framework.views import exception_handler

def 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

#無(wú)需調(diào)用,報(bào)錯(cuò)的時(shí)候他自己會(huì)調(diào)用??!

以上這篇django rest framework 自定義返回方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python3多模式匹配問題的實(shí)現(xiàn)

    Python3多模式匹配問題的實(shí)現(xiàn)

    Aho-Corasick是一種高效的多模式字符串匹配算法,適用于敏感詞檢測(cè)、文本過(guò)濾等,本文就來(lái)介紹一下Python3多模式匹配,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-01-01
  • python interpolate插值實(shí)例

    python interpolate插值實(shí)例

    這篇文章主要介紹了python interpolate插值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • pytorch中.to(device) 和.cuda()的區(qū)別說(shuō)明

    pytorch中.to(device) 和.cuda()的區(qū)別說(shuō)明

    這篇文章主要介紹了pytorch中.to(device) 和.cuda()的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • pandas統(tǒng)計(jì)重復(fù)值次數(shù)的方法實(shí)現(xiàn)

    pandas統(tǒng)計(jì)重復(fù)值次數(shù)的方法實(shí)現(xiàn)

    這篇文章主要介紹了pandas統(tǒng)計(jì)重復(fù)值次數(shù)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python使用xlrd和xlwt批量讀寫excel文件的示例代碼

    Python使用xlrd和xlwt批量讀寫excel文件的示例代碼

    這篇文章主要介紹了Python使用xlrd和xlwt批量讀寫excel文件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫

    python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 淺談Python爬取網(wǎng)頁(yè)的編碼處理

    淺談Python爬取網(wǎng)頁(yè)的編碼處理

    下面小編就為大家?guī)?lái)一篇淺談Python爬取網(wǎng)頁(yè)的編碼處理。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • 在pycharm中關(guān)掉ipython console/PyDev操作

    在pycharm中關(guān)掉ipython console/PyDev操作

    這篇文章主要介紹了在pycharm中關(guān)掉ipython console/PyDev操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python實(shí)現(xiàn)CET查分的方法

    Python實(shí)現(xiàn)CET查分的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)CET查分的方法,實(shí)例分析了Python操作鏈接查詢的技巧,需要的朋友可以參考下
    2015-03-03
  • 13個(gè)簡(jiǎn)便高效的Python腳本分享

    13個(gè)簡(jiǎn)便高效的Python腳本分享

    Python是頂級(jí)編程語(yǔ)言之一,它具有許多程序員從未使用過(guò)的許多隱藏功能。在這篇博客中,將和大家分享一下你可能從未使用過(guò)的13個(gè)Python腳本,感興趣的可以學(xué)習(xí)一下
    2023-01-01

最新評(píng)論

光泽县| 都兰县| 富顺县| 重庆市| 措勤县| 滨州市| 游戏| 客服| 黔东| 商都县| 金湖县| 新密市| 永川市| 吉首市| 沙洋县| 龙州县| 镇坪县| 平山县| 天水市| 丰台区| 昌黎县| 九龙县| 南昌市| 井陉县| 南乐县| 灵川县| 南丰县| 磐安县| 张掖市| 南通市| 昭通市| 孝昌县| 酒泉市| 南华县| 汉沽区| 沭阳县| 大悟县| 高平市| 辉南县| 墨玉县| 林甸县|