django调用python脚本返回_讲解django rest framework 自定义返回方法
讲解django rest framework 自定义返回方法
大家在用Django Rest Framework的时候会发现默认继承后,增删改查的返回信息都是一段data,这是因为我实际是状态码和信息你在调用api的时候是看不到的,仅仅如此么?并不是这样,在我前端调用后端的时候,实际上相关的code和msg是能看得到的,但是我们在普通的调用api他只是单单的返回data信息,这个是不够我们满足需求的,毕竟我们不仅仅需要用前端需调用,下面我们来自定义Response返回信息
Django(2.0)
Django Rest Framework
Python3.6
1、自定义Response,继承rest framework的Response
#这个方法py文件我们可以写到任意地方,目的是在我们需要写一个Baseview的时候将放回方法引用
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、重写Base类,将增删改查方法重写并且返回方法为刚刚定义好的新的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视图继承以及测试
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")
这样我们就完成了自定义返回信息,下一节将讲解自定义异常
补充知识: django rest framework 自定义异常返回
上一节给大家介绍了自定义Response返回信息,但那个只用于正确的返回success,但是当我们用到了权限
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_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
无需调用,报错的时候他自己会调用!!
以上这篇django rest framework 自定义返回方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
django调用python脚本返回_讲解django rest framework 自定义返回方法相关推荐
- java 调用python脚本过程_通过Java调用Python脚本
在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...
- django调用python脚本返回_Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境...
单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的settin ...
- django调用python脚本返回_Django使用HttpResponse返回图片并显示的方法
做了一个关于Django的小案例,想要在网页中显示图片,直接在img标签的src属性写图片的路径是不能显示的,查询资料发现在Django中使用图片这类的资源相当繁琐需要进行一定D的配置,摸索了一会没有 ...
- python c#_【分享】C# 调用 Python 脚本, 与 Python 调用 C# 类库
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C# 调用 Python 脚本 操作步骤 1.创建一个控制台程序. O0101_DotNetCallPython. 2.管理 Nuget 程序包,搜索 I ...
- python 调用控制台并获取返回结果_Java调用Python脚本并获取返回值
在Java程序中有时需要调用Python的程序,这时可以使用一般的PyFunction来调用python的函数并获得返回值,但是采用这种方法有可能出现一些莫名其妙的错误,比如ImportError.在 ...
- java执行python返回null_[转]java调用python脚本以及通过Process.waitFor()直接调用python模块返回错误代码1的一种解决办法...
常见的java调用python脚本方式 通过jython提供的类库实现 通过Runtime.getRuntime()开启进程来执行脚本文件 通过jython提供的类库实现 通过jython实现的话,我 ...
- java调用python脚本_调用Python写vb的脚本方法
某个项目中涉及到这样一个情景: VB写的原始项目要调用Python的一些方法完成特殊的操作, 那么这就涉及到了,在.Net Framework中如何调用Python的脚本方法. 具体步骤流程如下所示: ...
- java执行python脚本_通过Java调用Python脚本
在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...
- python调用exe程序 传入参数_关于使用c#调用python脚本文件,脚本文件需要传递参数...
最近工作中需要干这个事,网上搜了搜资料,改了改,基本是这样 建立一个控制台应用程序: 比如 加入我在命令行直接调用python脚本,命令为 y安装python后,添加环境变量,path下面,加入路径. ...
最新文章
- 【kissfft】使用kiss_fft做FFT与iFFT
- OpenBSD 5.2 发布
- 基于SpringBoot + Vue的小程序商城项目(附源码),支持分销、团购、秒杀、优惠券。。。...
- java 多线程编程指南 pdf_Java-多线程编程
- 显示隐藏-display(HTML、CSS)
- SQL基础--gt; 约束(CONSTRAINT)
- 为什么使用php工厂模式,PHP 工厂模式使用方法
- ws配置 zuul_spring cloud zuul 服务网关
- Matlab 2020b安装教程
- Excel如何将英语大写快速转变为小写
- labjs 分析转载
- Clone 2. 肿瘤克隆进化之不同进化模式
- Java web----多表查询
- Python123-练习题
- python 将单词分割成字母_Python基于分隔符单词拆分列表
- exec 和 exec_
- 如何进行格式转化?几招帮你搞定格式转换
- 安徽专升本计算机基础【柳青版】书后全部名词解释习题+部分课后答案
- 招聘ABAP开发程序员
- java Class 加载过程 符号引用 直接引用
热门文章
- caffe模型文件解析_「机器学习」截取caffe模型中的某层
- c语言 结构体的,c语言之结构体
- 计算机应用杂志投稿,计算机类杂志 (可网上投稿)
- [洪流学堂]Unity2017.3新功能:程序集定义(Assembly Definition File)功能详解
- html 监听后端变化_SpringBoot2.0整合WebSocket,实现后端数据实时推送!
- 容器入门(1) - 安装和使用Docker Registry
- 在Blazor中构建数据库应用程序——第4部分——UI控件
- GitHub 回应突然断供:身不由己,无权提前通知预警
- 实现机器学习的循序渐进指南VII——Blending Stacking
- python difflib详解_在 Python 中使用 difflib 比较字符串