上节提到过,REST框架分别提供了对函数和类的装饰器,之前已经都是通过函数来写视图函数的,现在来尝试使用class 类来实现视图函数

使用基于类编写API视图,允许重用常用的功能,减少代码重复。

一、REST框架基于类实现API

根据之前的函数视图重写基于类的视图,只涉及到了重构views.py

# 第三种 类视图
from django.http import Http404
from test_app import serializer
from test_app import models
from rest_framework import views # views.APIView 为类的装饰器
from rest_framework.response import Response
from rest_framework import status class Game_List(views.APIView):
def get(self, request, format=None):
games_obj = models.Game.objects.all()
games_serializer = serializer.Test_app_model_serializer(instance=games_obj, many=True)
return Response(games_serializer.data, status=status.HTTP_200_OK) def post(self, reqeust, format=None):
data = reqeust.data
game_serializer = serializer.Test_app_model_serializer(data=data)
if game_serializer.is_valid():
game_serializer.save()
return Response(game_serializer.data, status=status.HTTP_201_CREATED)
return Response(game_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

现在看起来和之前类似,但在不同的HTTP方式之间有更好的分离,继续编写更新实例视图

class Game_Info(views.APIView):
def get_obj(self, game_id):
try:
return models.Game.objects.get(id=game_id)
except models.Game.DoesNotExist as not_exist:
raise Http404 def get(self, reqeust, game_id, format=None): # 函数视图和类函数都可以使用路由系统传递过来的未命名分组数据
game_serializer = serializer.Test_app_model_serializer(instance=self.get_obj(game_id))
return Response(game_serializer.data) def put(self, request, game_id, format=None):
game_serializer = serializer.Test_app_model_serializer(instance=self.get_obj(game_id), data=request.data)
if game_serializer.is_valid():
game_serializer.save()
return Response(game_serializer.data)
return Response(game_serializer.errors) def delete(self, request, game_id, format=None):
self.get_obj(game_id).delete()
return Response(status.HTTP_204_NO_CONTENT)

二、使用mixins类实现视图函数

下面来使用REST框架的mixins类中实现

# 第四种 mixin类视图
from test_app import serializer
from test_app import models
from rest_framework import mixins
from rest_framework import generics class Game_List(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
queryset = models.Game.objects.all()
serializer_class = serializer.Test_app_model_serializer def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)

基类提供核心功能,而mixin类提供.list().create()操作。然后,我们将明确的绑定getpost方法绑定到适当的操作。到目前为止足够简单的东西

class Game_Info(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView):
queryset = models.Game.objects.all()
serializer_class = serializer.Test_app_model_serializer def get(self, request, *args, **kwargs):
print(request,args,kwargs)
return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)

同样,我们正在使用的GenericAPIView类来提供核心功能,并混入增加提供.retrieve().update().destroy()方法。

三、使用泛型类视图

# 第五种 泛型类视图
from test_app import serializer
from test_app import models
from rest_framework import generics class Game_List(generics.ListCreateAPIView):
queryset = models.Game.objects.all()
serializer_class = serializer.Test_app_model_serializer class Game_Info(generics.RetrieveUpdateDestroyAPIView):
queryset = models.Game.objects.all()
serializer_class = serializer.Test_app_model_serializer

汇总:

from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt # 忽略post请求时的csrf问题
from test_app import serializer
from test_app import models
from rest_framework.renderers import JSONRenderer # restful提供的序列化类
from rest_framework.parsers import JSONParser # restful提供的反序列化类 # Create your views here. # # 第一种函数视图
# @csrf_exempt
# def game_list(request):
# if request.method == 'GET':
# print(request.data)
# game = models.Game.objects.all() # 获取数据库中所有数据
# game_serializer = serializer.Test_app_model_serializer(instance=game,
# many=True) # 通过自定义的serializer实例化数据,many参数为True表示处理多条数据
# # return HttpResponse(JSONRenderer().render(game_serializer.data), status=200) # 序列化serializer实例的数据
# return JsonResponse(game_serializer.data,safe=False)
# elif request.method == 'POST':
# data = JSONParser().parse(request) # 通过JsonParser类反序列化POST过来的数据
# game_serializer = serializer.Test_app_model_serializer(data=data) # 通过反序列化后的数据创建serializer实例
# print(game_serializer)
# if game_serializer.is_valid(): # 通过is_valid()方法判断数据类型是否正确,这点和Django的From相似
# game_serializer.save() # 验证通过保存数据,这里的game_serializer是自定义serializer的create函数返回的对象,进行保存
# # return HttpResponse(JSONRenderer().render(game_serializer.data)) # 序列化数据返回前端
# return JsonResponse(game_serializer.data,safe=False)
# else: # 验证不通过,输出对应的报错信息
# print("验证不通过")
# # return HttpResponse(JSONRenderer().render(game_serializer.errors))
# print(type(game_serializer.errors))
# return JsonResponse(game_serializer.errors)
#
# # 注释同上
# @csrf_exempt
# def game_info(request, game_id):
# game_obj = models.Game.objects.get(id=game_id)
# if request.method == 'GET':
# game_serializer = serializer.Test_app_model_serializer(instance=game_obj)
# data = JSONRenderer().render(game_serializer.data)
# return HttpResponse(data)
# elif request.method == 'PUT':
# data = JSONParser().parse(request)
# game_serializer = serializer.Test_app_model_serializer(instance=game_obj, data=data)
# if game_serializer.is_valid():
# game_serializer.save()
# # return HttpResponse(JSONRenderer().render(game_serializer.data))
# return JsonResponse(game_serializer.data, status=201)
# return JsonResponse(game_serializer.errors, status=400)
# elif request.method == 'DELETE':
# game_obj.delete()
# return HttpResponse(status=204) # 第二种函数视图
# from rest_framework import status
# from rest_framework.decorators import api_view
# from rest_framework.response import Response
# from test_app import serializer
# from test_app import models
#
#
# @api_view(['GET', 'POST'])
# def game_list(request, format=None):
# print(format)
# if request.method == 'GET':
# games = models.Game.objects.all()
# games_serializer = serializer.Test_app_model_serializer(instance=games, many=True)
# return Response(games_serializer.data)
# elif request.method == 'POST':
# game_serializer = serializer.Test_app_model_serializer(data=request.data)
# if game_serializer.is_valid():
# game_serializer.save()
# return Response(game_serializer.data, status=status.HTTP_201_CREATED)
# return Response(game_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
#
#
# @api_view(['GET', 'PUT', 'DELETE'])
# def game_info(request, game_id, format=None):
# try:
# game_obj = models.Game.objects.get(id=game_id)
# except models.Game.DoesNotExist as e:
# return Response(status=status.HTTP_404_NOT_FOUND)
# # return HttpResponse(e,status=status.HTTP_404_NOT_FOUND)
# if request.method == 'GET':
# game_serializer = serializer.Test_app_model_serializer(instance=game_obj)
# return Response(game_serializer.data)
# elif request.method == 'PUT':
# game_serializer = serializer.Test_app_model_serializer(instance=game_obj, data=request.data)
# if game_serializer.is_valid():
# game_serializer.save()
# return Response(game_serializer.data)
# return Response(game_serializer.errors)
# elif request.method == 'DELETE':
# game_obj.delete()
# return Response(status=status.HTTP_204_NO_CONTENT) # # 第三种 APIView类视图
# from django.http import Http404
# from test_app import serializer
# from test_app import models
# from rest_framework import views
# from rest_framework.response import Response
# from rest_framework import status
#
#
# class Game_List(views.APIView):
# def get(self, request, format=None):
# print(locals())
# games_obj = models.Game.objects.all()
# games_serializer = serializer.Test_app_model_serializer(instance=games_obj, many=True)
# return Response(games_serializer.data, status=status.HTTP_200_OK)
#
# def post(self, reqeust, format=None):
# data = reqeust.data
# game_serializer = serializer.Test_app_model_serializer(data=data)
# if game_serializer.is_valid():
# game_serializer.save()
# return Response(game_serializer.data, status=status.HTTP_201_CREATED)
# return Response(game_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
#
#
# class Game_Info(views.APIView):
# def get_obj(self, game_id):
# try:
# return models.Game.objects.get(id=game_id)
# except models.Game.DoesNotExist as not_exist:
# raise Http404
#
# def get(self, reqeust, game_id,format=None):
# game_serializer = serializer.Test_app_model_serializer(instance=self.get_obj(game_id))
# return Response(game_serializer.data)
#
# def put(self, request, game_id, format=None):
# game_serializer = serializer.Test_app_model_serializer(instance=self.get_obj(game_id), data=request.data)
# if game_serializer.is_valid():
# game_serializer.save()
# return Response(game_serializer.data)
# return Response(game_serializer.errors)
#
# def delete(self, request, game_id, format=None):
# self.get_obj(game_id).delete()
# return Response(status.HTTP_204_NO_CONTENT) # # 第四种 mixin类视图
# from test_app import serializer
# from test_app import models
# from rest_framework import mixins
# from rest_framework import generics
#
#
# class Game_List(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
# queryset = models.Game.objects.all()
# serializer_class = serializer.Test_app_model_serializer
#
# def get(self, request, *args, **kwargs):
# return self.list(request, *args, **kwargs)
#
# def post(self, request, *args, **kwargs):
# return self.create(request, *args, **kwargs)
#
#
# class Game_Info(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView):
# queryset = models.Game.objects.all()
# serializer_class = serializer.Test_app_model_serializer
#
# def get(self, request, *args, **kwargs):
# print(request,args,kwargs)
# return self.retrieve(request, *args, **kwargs)
#
# def put(self, request, *args, **kwargs):
# return self.update(request, *args, **kwargs)
#
# def delete(self, request, *args, **kwargs):
# return self.destroy(request, *args, **kwargs) # 第五种 泛型类视图
from test_app import serializer
from test_app import models
from rest_framework import generics class Game_List(generics.ListCreateAPIView):
queryset = models.Game.objects.all()
serializer_class = serializer.Test_app_model_serializer class Game_Info(generics.RetrieveUpdateDestroyAPIView):
queryset = models.Game.objects.all()
serializer_class = serializer.Test_app_model_serializer

REST视图函数的实现方法

django rest-framework 3.类 实现restful的更多相关文章

  1. Django:Django Rest Framework

    Django Rest Framework   一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称 ...

  2. Django Rest Framework(阿奇)

    Django Rest Framework 一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中 ...

  3. 利用 Django REST framework 编写 RESTful API

    利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...

  4. RESTful API学习Day2 - Django REST framework

    Django REST framework 参考文档: 官方文档:官方文档 中文文档:中文文档 一.是什么? 基于Django开发RESTful API的一个框架 为什么要用它? 补充: ​ CBV的 ...

  5. RESTful架构&简单使用Django rest framework

    RESTful架构 1 什么是REST REST全称是Representational State Transfer,中文意思是表述性状态转移. 它首次出现在2000年Roy Fielding的博士论 ...

  6. django rest framework restful 规范

    内容回顾: . django请求生命周期 -> 执行遵循wsgi协议的模块(socket服务端) -> 中间件(路由匹配) -> 视图函数(业务处理:ORM.模板渲染) -> ...

  7. day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能

    目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...

  8. RESTful API 和 Django REST framework

    100天 cmdb最后一天 #RESTful API - 定义规范 如get就是请求题 - 面向资源编程 把网络任何东西都当作资源 #给一个url,根据方法的不同对资源做不同的操作 #返回结果和状态码 ...

  9. 4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍

    4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍 天涯明月笙 关注 2018.02.20 19:23* 字数 762 阅读 135 ...

  10. Django rest framework (视图类详解)

    官网:https://www.django-rest-framework.org/api-guide/viewsets/ 在django rest framework 视图中一共有N个类 第一类:AP ...

随机推荐

  1. caffe实现GAN

    我实现GAN网络结构比较复杂: 通过建立两个一模一样的网络,他们相对应的层共享权重,一个网络用来跟新D model另一个网络用来更新G model 更新G model的网络,D部分只进行梯度传递,不进 ...

  2. 09-TypeScript中的继承

    在后端开发语言中,继承是非常重要的概念,继承可以让子类具有父类的成员和方法,通过实例化子类,就可以访问父类的成员和方法. 在JavaScript中,需要通过原型模式来模拟继承的实现.而在TypeScr ...

  3. JAVA_SE基础——5.第一个Java程序HelloWorld&注释的应用

    配置完JDK&环境变量后,我们就可以开始写程序了,那么程序怎么写呢,用什么工具呢,我建议 为了方便学习,我们最好在一个磁盘下建立一个专门的文件来写java程序,比如就在D盘下建立一个名为&qu ...

  4. api-gateway实践(06)新服务网关 - 请求监控

    一.实时监控 用户点击服务实例,系统显示服务实例-version下的api列表, 用户点击某个api的如下两个图标 1.API请求次数监控 横轴:时间,粒度为分钟 纵轴:请求访问次数 展示:失败数(红 ...

  5. 新概念英语(1-123)A trip to Australia

    Who is the man with the beard?(胡须)A:Look, Scott. This is a photograph I took during my trip to Austr ...

  6. ssh整合之一spring的单独运行环境

    这是本人第一次写博客,不足之处,还希望各位园友指出,在此先谢谢各位了! 先说我们的这三大框架,即struts,spring,hibernate,我们要进行整合的话,第一步是先单独搭建我们的Spring ...

  7. python 字符串 字节

    字符串 字节   a. 字符串转字节 1 2 key = "xxxx" bkey = bytes(key,encoding='utf-8') b. bytearray 数组 1 2 ...

  8. SQL基础-----DML语句

    之前已经介绍过SQL基础之DDL(数据库定义语言)语句,http://www.cnblogs.com/cxq0017/p/6433938.html(这是地址) 这篇文章主要介绍DML语句(数据库操纵语 ...

  9. 存储过程学习笔记(SQL数据库

    一.   存储过程简介 Sql Server的存储过程是一个被命名的存储在服务器上的Transacation-Sql语句集合,是封装重复性工作的一种方法,它支持用户声明的变量.条件执行和其他强大的编程 ...

  10. Hibernate注解开发详解

    *****************关于注解的简单介绍 详细介绍请点击这里注解详细教程 package com.tomowork.pojo; import org.hibernate.annotatio ...