上节提到过,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. JAVA_SE基础——30.构造代码块

    黑马程序员入学blog...构造代码块作用:给所有的对象进行统一的初始化. 问题:要求每个小孩出生都会哭,这份代码有两个构造函数,如果需要每个小孩出生都要哭的话,那么就需要在不同的构造函数中都调用cr ...

  2. ViurtualBox配置虚拟机Linux的网络环境

    之前可以使用VMware配置成功,让虚拟机和本地通信,虚拟机可以访问外网,但是VMware体积太大了,最后终于把virtualBox也配置成功,也使得两者兼备 环境:本地windows7 64位专业版 ...

  3. MySQL关系表查询两个表的数据

    如下,有四张表:游戏类型表,游戏表,点卡和游戏关系表,点卡表 CREATE TABLE `gamesType`( `tId` INT AUTO_INCREMENT NOT NULL PRIMARY K ...

  4. Python-socket网络编程-Day8

    目录Day8-Python socket 11.Socket 11.1.socket和file的区别: 11.2.WEB服务应用: 21.3.更多功能 21.4.socket方法: 41.5. 服务端 ...

  5. LinkedHashMap就这么简单【源码剖析】

    前言 声明,本文用得是jdk1.8 前面已经讲了Collection的总览和剖析List集合以及散列表.Map集合.红黑树还有HashMap基础了: Collection总览 List集合就这么简单[ ...

  6. codeforces round 425 div2

    A. Sasha and Sticks 水题,判断一下次数的奇和偶就可以的. B. Petya and Exam 赛上的时候没有写出来,orz,记录一下吧. 题意:给出一个模式串,可能会有?和*两种符 ...

  7. ZooKeeper:win7上安装单机及伪分布式安装

    zookeeper是一个为分布式应用所设计的分布式的.开源的调度服务,它主要用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用,协调及其管理的难度,提高性能的分布式服务. 本章的目的:如何 ...

  8. UVA-10714 Ants---蚂蚁模拟

    题目链接: https://vjudge.net/problem/UVA-10714 题目大意: 给你一个长为L厘米的木棍在上面有n只蚂蚁,蚂蚁的爬行时间均为1厘米/秒,两只蚂蚁先遇会立即调转方向,调 ...

  9. bs4解析要获取被注掉的部分需先将注释符号去掉

    <div class="xzcf-content"> <div id="sfxz"> <div class="main- ...

  10. Python3NumPy——数组(2)之数学空间与NumPy空间

    0 介绍 本文承接上一篇,文章采用新的阐述方式,将数学中的表达与NumPy中的函数关联起来. 采用这种方式,可以直接建立数学表达与计算系统的对应关系,更易理解. 由于博客编写时间有限,每次尝试一个知识 ...