import json

from django.db import DatabaseError
from django.http import HttpResponse
from django.http import JsonResponse
from django.shortcuts import render
# Create your views here.

from django.views import View

# http://127.0.0.1:8000/books/

from rest_framework.authentication import SessionAuthentication
from rest_framework.decorators import action
from rest_framework.generics import GenericAPIView, CreateAPIView, ListAPIView, RetrieveAPIView, UpdateAPIView,DestroyAPIView, ListCreateAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin,DestroyModelMixin
from rest_framework.pagination import PageNumberPagination
from rest_framework.permissions import IsAuthenticated, AllowAny
from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet from books.models import BookInfo, HeroInfo
from books.serializers import BookInfoSerializer, HeroInfoSerializer, BookInfoModelSerializer, HeroInfoModelSerializer,BookInfoSerializerForModidyRead
def test(request):
s = HeroInfoModelSerializer()
print(s)
return HttpResponse("OK") print("使用view开始")
# http://127.0.0.1:8000/heros/id/
class HeroView(View):
def get(self,request,pk):
try:
hero = HeroInfo.objects.get(pk=pk)
except Exception as e:
return HttpResponse(status=404)
serializer = HeroInfoSerializer(hero)
return JsonResponse(serializer.data) class BooksView(View):
def get(self, request):
try:
books = BookInfo.objects.all()
except Exception as e:
return HttpResponse(status=404)
serializer = BookInfoSerializer(books,many=True)
return JsonResponse(serializer.data,safe=False) def post(self, request):
json_bytes = request.body
json_str = json_bytes.decode()
json_dict = json.loads(json_str)
print(json_dict)
# 校验参数
serializer = BookInfoSerializer(data=json_dict)
# 如果校验不成功直接抛出异常
success = serializer.is_valid(raise_exception=True)
print(success)
if success:
serializer.save()
return JsonResponse(serializer.data,status=201) # http://127.0.0.1:8000/books/id/
class BookView(View): def get(self, request, pk):
try:
book = BookInfo.objects.get(pk=pk)
except Exception as e:
return HttpResponse(status=404)
serializer = BookInfoSerializer(book)
return JsonResponse(serializer.data) def put(self, request, pk):
try:
book = BookInfo.objects.get(pk=pk)
except Exception as e:
return HttpResponse(status=404)
json_bytes = request.body
json_str = json_bytes.decode()
json_dict = json.loads(json_str)
print(json_dict) serializer = BookInfoSerializer(instance=book, data=json_dict,partial=True)
# 如果校验不成功直接抛出异常
success = serializer.is_valid(raise_exception=True)
print(success)
if success:
serializer.save()
return JsonResponse(serializer.data,status=201) def delete(self, request, pk):
try:
book = BookInfo.objects.get(pk=pk)
except Exception as e:
return HttpResponse(status=404) book.delete()
return HttpResponse(status=204)
print("使用View结束")

print("使用APIView开始")
# 利用APIView中强大的request和response
# request中的request.data可以自动帮我们进行解码操作,因为其中含有DRF的Parser解析器,会自动的根据
# content-type解析数据,将解析的数据添加到Request类中,
# response可以根据我们的请求给我们返回我们需要的数据,用户想要什么界面就可以直接渲染出想要的结果
class BooksView(APIView):
def get(self, request):
books = BookInfo.objects.all()
serializer = BookInfoModelSerializer(books,many=True)
return Response(serializer.data) def post(self, request):
# 校验参数
serializer = BookInfoModelSerializer(data=request.data)
# 如果校验不成功直接抛出异常
success = serializer.is_valid(raise_exception=True)
if success:
serializer.save()
return Response(serializer.validated_data,status=201) # http://127.0.0.1:8000/books/id/
class BookView(APIView): def get(self, request, pk):
book = BookInfo.objects.get(pk=pk)
serializer = BookInfoModelSerializer(book)
return Response(serializer.data) def put(self, request, pk):
book = BookInfo.objects.get(pk=pk)
serializer = BookInfoModelSerializer(instance=book, data=request.data,partial=True)
# 如果校验不成功直接抛出异常
success = serializer.is_valid(raise_exception=True)
if success:
serializer.save()
return Response(serializer.validated_data,status=201) def delete(self, request, pk):
book = BookInfo.objects.get(pk=pk)
book.delete()
return HttpResponse(status=204)
print("使用APIView结束")

print("使用GenericAPIView开始")
class BooksView(GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer def get(self, request):
books = self.get_queryset()
serializer = self.get_serializer(books,many=True)
return Response(serializer.data) def post(self, request):
# 校验参数
serializer = self.get_serializer(data=request.data)
# 如果校验不成功直接抛出异常
print(request.data)
success = serializer.is_valid(raise_exception=True)
print(success)
if success:
serializer.save()
return Response(serializer.validated_data,status=201) # http://127.0.0.1:8000/books/id/
class BookView(GenericAPIView):
queryset = BookInfo.objects.all()
# serializer_class = BookInfoModelSerializer
# lookup_url_kwarg 指定的是路径中参数的名称,默认叫pk
# lookup_field 指的是数据库中的字段
# lookup_field = "id" def get_serializer_class(self):
return BookInfoModelSerializer def get(self, request, pk):
book = self.get_object()
serializer = self.get_serializer(book)
return Response(serializer.data) def put(self, request, pk):
book = self.get_object()
serializer = self.get_serializer(instance=book, data=request.data,partial=True)
success = serializer.is_valid(raise_exception=True)
if success:
serializer.save()
return Response(serializer.validated_data,status=201) def delete(self, request, pk):
book = self.get_object()
book.delete()
return Response(status=204)
print("使用GenericAPIView以结束")

print("GenericAPIView的扩展类开始")
扩展类:针对于某一个类进行功能的扩展,只能够结合这个类进行使用,不能单独使用
子类:针对父类的功能进行扩展,可以单独使用
class BooksView(ListModelMixin,CreateModelMixin,GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer def get(self, request):
return self.list(request) def post(self, request):
return self.create(request) class BookView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer def get(self, request, pk):
return self.retrieve(request,pk) def put(self, request, pk):
return self.update(request,pk) def delete(self, request, pk):
return self.destroy(request,pk)
print("GenericAPIView的扩展类以结束")

# ListAPIView  --> get()
# CreateAPIView --> post()
# ListCreateAPIView
# get
# post
# RetrieveAPIView --> get()
# UpdateAPIView --> put() patch()
# DestroyAPIView --> delete()
# RetrieveUpdateAPIView --> get() put() patch()
# RetrieveDestroyAPIView --> get() delete()
# RetrieveUpdateDestroyAPIView --> get() put() patch() delete()
class BooksView(ListCreateAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer class BookView(RetrieveUpdateDestroyAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer
print("GenericAPIView的子类以结束")

print("使用视图集开始")
# 关于图书的这个资源,我们不想写两个类视图,我们就想写一个类
# 关于图书的操作:获取列表\增加\获取单个\修改\删除
# list()\create()\retrieve()\update()\destory()
# 视图集:视图集并不是必须的,如果你足够的懒,那么可以使用视图集
# 达到的效果:多个路径,只需要写一个class即可
# 注意:要在urls.py中来配置,不同路径\不同请求方法 究竟应该调用哪个方法
# 视图集的功能:可以让我们通过不同的路径,访问到同一个class中不同方法
# 视图集中自定义动作的实现:
# 1\在urls.py中配置好路径和这个class中哪个方法的映射关系
# 2\在这个class中通过def的方式定义好方法, 这个方法中得要有request参数,可能会有pk
# http://127.0.0.1:8000/books/?page=2&page_size=2/
class LargeResultsSetPagination(PageNumberPagination):
page_size = 2
page_size_query_param = 'page_size'
max_page_size = 10 class BookViewSet(ModelViewSet):
"""
list:
获取图书信息
retrieve:
获取 单个图书信息
latest:
获取图书的最新信息
read:
修改图书阅读量的数据 """
queryset = BookInfo.objects.all()
# throttle_classes = (UserRateThrottle,)
filter_fields = ('btitle', 'bread')
pagination_class = LargeResultsSetPagination def get_permissions(self):
if self.action == "latest":
return [IsAuthenticated()]
return [AllowAny()] # 我们可以通过视图集中的self.action决定当前是哪一种动作,通过不同的动作,返回不同的序列化器类的引用
def get_serializer_class(self):
if self.action == "read":
return BookInfoSerializerForModidyRead
return BookInfoModelSerializer @action(methods=["get"],detail=False)
def latest(self,request):
raise DatabaseError() book = BookInfo.objects.latest("id")
s = self.get_serializer(book)
return Response(s.data) @action(methods=["put"],detail=True)
def read(self,request,pk):
book = self.get_object()
s = self.get_serializer(book,data=request.data)
success = s.is_valid(raise_exception=True)
if success:
s.save()
return Response(s.validated_data,status=201)
print("使用视图集ViewSet结束")

# 局部限流
class BookDetailView(RetrieveAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer
authentication_classes = [SessionAuthentication]
permission_classes = [IsAuthenticated]
throttle_classes = (UserRateThrottle,) # 局部过滤
class BookListView(ListAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer
filter_fields = ('btitle', 'bread')

DRF框架中的演变View的更多相关文章

  1. django drf框架中的user验证以及JWT拓展的介绍

    登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ...

  2. drf框架中所有视图及用法

    0909自我总结 drf框架中所有视图及用法 一.drf框架中的所有视图类 from django.views import View from rest_framework import views ...

  3. drf框架中jwt认证,以及自定义jwt认证

    0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ...

  4. DRF框架中分页功能接口

    目录 DRF框架中分页功能接口 DRF框架中分页功能接口 一.在框架中提供来三个类来实现分页功能,PageNumberPagination.LimitOffsetPagination.CursorPa ...

  5. drf框架中认证与权限工作原理及设置

    0909自我总结 drf框架中认证与权限工作原理及设置 一.概述 1.认证 工作原理 返回None => 游客 返回user,auth => 登录用户 抛出异常 => 非法用户 前台 ...

  6. drf框架中分页组件

    drf框架中分页组件 普通分页(最常用) 自定制分页类 pagination.py from rest_framework.pagination import PageNumberPagination ...

  7. DRF框架中链表数据通过ModelSerializer深度查询方法汇总

    DRF框架中链表数据通过ModelSerializer深度查询方法汇总 一.准备测试和理解准备 创建类 class Test1(models.Model): id = models.IntegerFi ...

  8. DRF框架中的异常处理程序

    目录 DRF框架中自定义异常处理 一.自定义异常的原因 二.如何设置处理异常的程序 DRF框架中自定义异常处理 一.自定义异常的原因 在Django和DRF框架中都封装了很多的处理异常的程序,可以处理 ...

  9. DRF框架中csrf异常

    一.报错信息 "detail": "CSRF Failed: CSRF cookie not set." 二.解决办法 方法一: 在配置文件中配置 REST_F ...

随机推荐

  1. mysql_innodb引擎

    innodb概括 1.Innodb是一种事务性存储引擎 2.完全支持事务的ACID特性 3.实现事务特性的原理: 使用Redo Log和Undo Log,Undo Log用于帮助未提交事务进行回滚,R ...

  2. redis配置配置文件

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 bytes # 1kb ...

  3. with rollup

    实验吧的一道ctf题,这两天无聊,做做ctf题.在实验吧被一道也题卡了好久. 页面很简单就是一个登陆页面,按照之前的经验觉得应该是注入吧.再看题猜测应该是绕waf之类的. 查看页面源码找到了提供的源代 ...

  4. HDU-1263(STL+排序)

    水果 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  5. python入门之排序,文件操作

    排序 li.sort() 对li列表从小到大排序,直接更新li列表 sorted(li) 返回一个li排序后的列表,并非直接对li作更新 列表元素必须是同一种数据类型 文件操作 打开文件: f = o ...

  6. bio,nio,aio简介

    https://mp.weixin.qq.com/s/F9WwcsFdCOwOeeDc0oc98w——<BIO,NIO,AIO 总结>总结和对比这三种的区别 https://www.jia ...

  7. freertos之内存管理

    任务.信号量.邮箱才调度器开始调度之前就应该创建,所以它不可能像裸奔程序那样的函数调用能确定需要多少内存资源,RTOS提供了3种内存管理的方法: 1 方法一:确定性好适合于任务.信号量.队列都不被删除 ...

  8. B. Apple Tree 暴力 + 数学

    http://codeforces.com/problemset/problem/348/B 注意到如果顶点的数值确定了,那么它分下去的个数也就确定了,那么可以暴力枚举顶点的数值. 顶点的数值是和LC ...

  9. .Net魔兽登录页面

    一,页面部分展示 二.代码展示 1.登录页面: public partial class FrmLogin : Form { public FrmLogin() { InitializeCompone ...

  10. MD5 介绍

    MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能: 输入任意 ...