快速实例

Quickstart

序列化

创建一个序列化类

简单使用

开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。

models部分:

from django.db import models# Create your models here.class Book(models.Model):title=models.CharField(max_length=32)price=models.IntegerField()pub_date=models.DateField()publish=models.ForeignKey("Publish")authors=models.ManyToManyField("Author")def __str__(self):return self.titleclass Publish(models.Model):name=models.CharField(max_length=32)email=models.EmailField()def __str__(self):return self.nameclass Author(models.Model):name=models.CharField(max_length=32)age=models.IntegerField()def __str__(self):return self.name

views部分:

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from django.shortcuts import HttpResponse
from django.core import serializersfrom rest_framework import serializersclass BookSerializers(serializers.Serializer):title=serializers.CharField(max_length=32)price=serializers.IntegerField()pub_date=serializers.DateField()publish=serializers.CharField(source="publish.name")#authors=serializers.CharField(source="authors.all")authors=serializers.SerializerMethodField()def get_authors(self,obj):temp=[]for author in obj.authors.all():temp.append(author.name)return tempclass BookViewSet(APIView):def get(self,request,*args,**kwargs):book_list=Book.objects.all()# 序列化方式1:# from django.forms.models import model_to_dict# import json# data=[]# for obj in book_list:#     data.append(model_to_dict(obj))# print(data)# return HttpResponse("ok")# 序列化方式2:# data=serializers.serialize("json",book_list)# return HttpResponse(data)# 序列化方式3:bs=BookSerializers(book_list,many=True)return Response(bs.data)

ModelSerializer

class BookSerializers(serializers.ModelSerializer):class Meta:model=Bookfields="__all__"depth=1

提交post请求

  def post(self,request,*args,**kwargs):bs=BookSerializers(data=request.data,many=False)if bs.is_valid():# print(bs.validated_data)
            bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)

重写save中的create方法

class BookSerializers(serializers.ModelSerializer):class Meta:model=Bookfields="__all__"# exclude = ['authors',]# depth=1def create(self, validated_data):authors = validated_data.pop('authors')obj = Book.objects.create(**validated_data)obj.authors.add(*authors)return obj

单条数据的get和put请求

class BookDetailViewSet(APIView):def get(self,request,pk):book_obj=Book.objects.filter(pk=pk).first()bs=BookSerializers(book_obj)return Response(bs.data)def put(self,request,pk):book_obj=Book.objects.filter(pk=pk).first()bs=BookSerializers(book_obj,data=request.data)if bs.is_valid():bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)

超链接API:Hyperlinked

class BookSerializers(serializers.ModelSerializer):publish= serializers.HyperlinkedIdentityField(                     view_name='publish_detail',                     lookup_field="publish_id",                     lookup_url_kwarg="pk")class Meta:model=Bookfields="__all__"#depth=1

urls部分:

urlpatterns = [url(r'^books/$', views.BookViewSet.as_view(),name="book_list"),url(r'^books/(?P<pk>\d+)$', views.BookDetailViewSet.as_view(),name="book_detail"),url(r'^publishers/$', views.PublishViewSet.as_view(),name="publish_list"),url(r'^publishers/(?P<pk>\d+)$', views.PublishDetailViewSet.as_view(),name="publish_detail"),
]

视图三部曲

使用混合(mixins)

上一节的视图部分:

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from django.shortcuts import HttpResponse
from django.core import serializersfrom rest_framework import serializersclass BookSerializers(serializers.ModelSerializer):class Meta:model=Bookfields="__all__"#depth=1class PublshSerializers(serializers.ModelSerializer):class Meta:model=Publishfields="__all__"depth=1class BookViewSet(APIView):def get(self,request,*args,**kwargs):book_list=Book.objects.all()bs=BookSerializers(book_list,many=True,context={'request': request})return Response(bs.data)def post(self,request,*args,**kwargs):print(request.data)bs=BookSerializers(data=request.data,many=False)if bs.is_valid():print(bs.validated_data)bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)class BookDetailViewSet(APIView):def get(self,request,pk):book_obj=Book.objects.filter(pk=pk).first()bs=BookSerializers(book_obj,context={'request': request})return Response(bs.data)def put(self,request,pk):book_obj=Book.objects.filter(pk=pk).first()bs=BookSerializers(book_obj,data=request.data,context={'request': request})if bs.is_valid():bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)class PublishViewSet(APIView):def get(self,request,*args,**kwargs):publish_list=Publish.objects.all()bs=PublshSerializers(publish_list,many=True,context={'request': request})return Response(bs.data)def post(self,request,*args,**kwargs):bs=PublshSerializers(data=request.data,many=False)if bs.is_valid():# print(bs.validated_data)
            bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)class PublishDetailViewSet(APIView):def get(self,request,pk):publish_obj=Publish.objects.filter(pk=pk).first()bs=PublshSerializers(publish_obj,context={'request': request})return Response(bs.data)def put(self,request,pk):publish_obj=Publish.objects.filter(pk=pk).first()bs=PublshSerializers(publish_obj,data=request.data,context={'request': request})if bs.is_valid():bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)

mixin类编写视图

from rest_framework import mixins
from rest_framework import genericsclass BookViewSet(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):queryset = Book.objects.all()serializer_class = BookSerializersdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)class BookDetailViewSet(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,generics.GenericAPIView):queryset = Book.objects.all()serializer_class = BookSerializersdef get(self, 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)

使用通用的基于类的视图

通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步。REST框架提供了一组已经混合好(mixed-in)的通用视图,我们可以使用它来简化我们的views.py模块。

from rest_framework import mixins
from rest_framework import genericsclass BookViewSet(generics.ListCreateAPIView):queryset = Book.objects.all()serializer_class = BookSerializersclass BookDetailViewSet(generics.RetrieveUpdateDestroyAPIView):queryset = Book.objects.all()serializer_class = BookSerializersclass PublishViewSet(generics.ListCreateAPIView):queryset = Publish.objects.all()serializer_class = PublshSerializersclass PublishDetailViewSet(generics.RetrieveUpdateDestroyAPIView):queryset = Publish.objects.all()serializer_class = PublshSerializers

viewsets.ModelViewSet

urls.py:

    url(r'^books/$', views.BookViewSet.as_view({"get":"list","post":"create"}),name="book_list"),url(r'^books/(?P<pk>\d+)$', views.BookViewSet.as_view({'get': 'retrieve','put': 'update','patch': 'partial_update','delete': 'destroy'}),name="book_detail"),

views.py:

class BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializers

认证与权限组件

认证组件

局部视图认证

在app01.service.auth.py:

class Authentication(BaseAuthentication):def authenticate(self,request):token=request._request.GET.get("token")token_obj=UserToken.objects.filter(token=token).first()if not token_obj:raise exceptions.AuthenticationFailed("验证失败!")return (token_obj.user,token_obj)

在views.py:

def get_random_str(user):import hashlib,timectime=str(time.time())md5=hashlib.md5(bytes(user,encoding="utf8"))md5.update(bytes(ctime,encoding="utf8"))return md5.hexdigest()from app01.service.auth import *from django.http import JsonResponse
class LoginViewSet(APIView): authentication_classes = [Authentication,]
    def post(self,request,*args,**kwargs):res={"code":1000,"msg":None}try:user=request._request.POST.get("user")pwd=request._request.POST.get("pwd")user_obj=UserInfo.objects.filter(user=user,pwd=pwd).first()print(user,pwd,user_obj)if not user_obj:res["code"]=1001res["msg"]="用户名或者密码错误"else:token=get_random_str(user)UserToken.objects.update_or_create(user=user_obj,defaults={"token":token})res["token"]=tokenexcept Exception as e:res["code"]=1002res["msg"]=ereturn JsonResponse(res,json_dumps_params={"ensure_ascii":False})

全局视图认证组件

settings.py配置如下:

REST_FRAMEWORK={"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",]
}

权限组件

局部视图权限

在app01.service.permissions.py中:

from rest_framework.permissions import BasePermission
class SVIPPermission(BasePermission):message="SVIP才能访问!"def has_permission(self, request, view):if request.user.user_type==3:return Truereturn False

在views.py:

from app01.service.permissions import *class BookViewSet(generics.ListCreateAPIView):permission_classes = [SVIPPermission,]queryset = Book.objects.all()serializer_class = BookSerializers

全局视图权限

settings.py配置如下:

REST_FRAMEWORK={"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],"DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",]
}

throttle(访问频率)组件

局部视图throttle

在app01.service.throttles.py中:

from rest_framework.throttling import BaseThrottleVISIT_RECORD={}
class VisitThrottle(BaseThrottle):def __init__(self):self.history=Nonedef allow_request(self,request,view):remote_addr = request.META.get('REMOTE_ADDR')print(remote_addr)import timectime=time.time()if remote_addr not in VISIT_RECORD:VISIT_RECORD[remote_addr]=[ctime,]return Truehistory=VISIT_RECORD.get(remote_addr)self.history=historywhile history and history[-1]<ctime-60:history.pop()if len(history)<3:history.insert(0,ctime)return Trueelse:return Falsedef wait(self):import timectime=time.time()return 60-(ctime-self.history[-1])

在views.py中:

from app01.service.throttles import *class BookViewSet(generics.ListCreateAPIView):throttle_classes = [VisitThrottle,]queryset = Book.objects.all()serializer_class = BookSerializers

全局视图throttle

REST_FRAMEWORK={"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],"DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],"DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",]
}

内置throttle类

在app01.service.throttles.py修改为:

class VisitThrottle(SimpleRateThrottle):scope="visit_rate"def get_cache_key(self, request, view):return self.get_ident(request)

settings.py设置:

REST_FRAMEWORK={"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],"DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],"DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",],"DEFAULT_THROTTLE_RATES":{"visit_rate":"5/m",}
}

解析器

request类

django的request类和rest-framework的request类的源码解析

局部视图

from rest_framework.parsers import JSONParser,FormParser
class PublishViewSet(generics.ListCreateAPIView):parser_classes = [FormParser,JSONParser]queryset = Publish.objects.all()serializer_class = PublshSerializersdef post(self, request, *args, **kwargs):print("request.data",request.data)return self.create(request, *args, **kwargs)

全局视图

REST_FRAMEWORK={"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],"DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],"DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",],"DEFAULT_THROTTLE_RATES":{"visit_rate":"5/m",},"DEFAULT_PARSER_CLASSES":['rest_framework.parsers.FormParser',]
}

分页

简单分页

from rest_framework.pagination import PageNumberPagination,LimitOffsetPaginationclass PNPagination(PageNumberPagination):page_size = 1page_query_param = 'page'page_size_query_param = "size"max_page_size = 5class BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializersdef list(self,request,*args,**kwargs):book_list=Book.objects.all()pp=LimitOffsetPagination()pager_books=pp.paginate_queryset(queryset=book_list,request=request,view=self)print(pager_books)bs=BookSerializers(pager_books,many=True)#return Response(bs.data)return pp.get_paginated_response(bs.data)

偏移分页

from rest_framework.pagination import LimitOffsetPagination

转载于:https://www.cnblogs.com/pengpengge/p/9640593.html

rest-framework框架的基本组件相关推荐

  1. php excel 组件,Yii Framework框架使用PHPExcel组件的方法示例

    本文实例讲述了Yii Framework框架使用PHPExcel组件的方法.分享给大家供大家参考,具体如下: PHPExcel下载地址http://www.yiiframework.com/exten ...

  2. ASP.NET之.NET FrameWork框架

    .NET FrameWork框架 是一套应用程序开发框架,主要目的提供一个开发模型. 主要的两个组件: 公共语言运行时(Common Language Runtime)(CLR): 提供内存管理.线 ...

  3. php行为和事件是什么,Yii Framework框架中事件和行为的区别及应用实例分析

    本文实例讲述了Yii Framework框架中事件和行为的区别及应用.分享给大家供大家参考,具体如下: 个人觉得,在 Yii 里面,最难以明白的就是事件(Event)和行为(behavior)了.这不 ...

  4. Django Rest Framework框架

    注明 本笔记主要参考书籍<Django应用开发实战><Django企业开发实战>,这两本书前者详细,后者精炼.本文还主要参考(?雾)金角大王的博客,当然还参考了其他人的博客.这 ...

  5. [转载]使用SPRING AOP框架和EJB组件

    使用SPRING AOP框架和EJB组件 摘要 快速发展的开发人员社区.对各种后端技术(包括JMS.JTA.JDO. Hibernate.iBATIS等等)的支持,以及(更为重要的)非侵入性的轻量级I ...

  6. J2EE中使用Spring AOP框架和EJB组件(1)

    J2EE中使用Spring AOP框架和EJB组件(1) [@more@]本文介绍了一种把J2EE应用程序中的EJB转换为Spring托管组件的方法,以及转换之后可以采用的强大技术.它还给出了几个实际 ...

  7. J2EE中使用Spring AOP框架和EJB组件(6)

    J2EE中使用Spring AOP框架和EJB组件(6) [@more@] 组合和链接通知 我们已经使用了一个简单的拦截器通知来实现附加的逻辑,并且将其当作一个独立的组件进行了测试.当应该在不进行修改 ...

  8. .Net 初步学习笔记之一——.Net 平台与.Net FrameWork框架的关系

    .Net 包含两部分 .Net平台 和.Net FrameWork 框架 1..Net FrameWork框架包含于.Net平台. .Net FrameWork提供环境和支撑保证.Net平台运行. 2 ...

  9. 请问如何把.net framework框架集成在安装程序里头?

    请问如何把.net framework框架集成在安装程序里头? 大家都知道在没有framework框架的机子上是无法运行.net编写的软件的 虽然把编写的软件做成安装软件在没有框架的机子上要安装时会自 ...

  10. DRF (Django REST framework) 框架介绍

    Web应用模式 在开发Web应用中,有两种应用模式: 前后端不分离 前后端分离 1 前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控 ...

最新文章

  1. 使用Action启动/关闭Service
  2. YII用户注冊和用户登录(五)之进行session和cookie分析 ,并在前后区分session和cookie...
  3. C语言实现词典编排算法(附完整源码)
  4. Linux系统中源码包tomcat的管理
  5. 股票市值高好还是低好呢?
  6. 移动应用的黄金四分类
  7. linux挂载lvm
  8. robocopy 备份_windows7自带功能robocopy 数据迁移和备份
  9. win10解压软件哪个好(win10用哪个解压软件)
  10. 一套PumpLinx泵阀仿真分析攻略
  11. 中發白——企业软件公司的战略大三元
  12. 多域名一个公网ip多内网应用服务同时使用80端口
  13. ecshop判断是手机访问还是web访问
  14. Java之多线程Runnable(2)卖烤鸭-yellowcong
  15. 联想集团:2021/22财年第一季度业绩
  16. 【进阶数据挖掘技术】进阶数据挖掘技术介绍
  17. 基于用户电影评价的分析预测
  18. Oracle中rowid的用法(全面)
  19. 行走江湖的50条忠告
  20. 一个android工程师写java后台的感受

热门文章

  1. 目标跟踪算法的分类(二)
  2. mysql innodb内幕_Mysql(技术内幕:InnoDB存储引擎)
  3. CentOS7开机进入emergency mode
  4. Windows核心编程_注册表操作和小练习程序关联
  5. iOS应用程序瘦身的静态库解决方案
  6. 大三下,第一次前端面试经历
  7. 传感器到底在“偷窥”什么
  8. 配置项setOption -- title
  9. 【Spring】Spring常用配置-Bean的初始化和销毁(生命周期)
  10. Qt编程之QtScript