django rest framework------得心应手
Warninig:本文仅适用小白,老手请绕道
总共,分三步
对于一个从未接触的新事物来说,我偏向于先看看他的外表,再一层一层扒掉它的外衣。
所以,这次,我们自顶向下的来看django rest framework是如何实现restful api的。
在django rest framework下提供restful api 总共分三步:
首先在viwe.py文件实现GoodsListViewSet如下:
from rest_framework import mixins from rest_framework import viewsetsclass GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):queryset = Goods.objects.all() # 获取待返回数据的querysetserializer_class = GoodsSerializer # 指定序列化器
接着,在serilaizers.py文件中实现GoodsSerializer如下:
from rest_framework import serializers from goods.models import Goodsclass GoodsSerializer(serializers.ModelSerializer): class Meta:model = Goods fields = '__all__'
最后,在url.py文件中配置路由信息如下:
from rest_framework.documentation import include_docs_urls from rest_framework.routers import DefaultRouterrouter = DefaultRouter() router.register(r'goods', GoodsListViewSet, base_name="goods")urlpatterns = [url(r'^', include(router.urls)) ]
好了。
现在已经可以通过浏览器中输入域名/goods 来获取goods的所有数据了,以json格式展现。
django rest framework还为我们处理了json数据,以便更好的展示
然后呢?只是这样吗?
到底强大在哪里呢?
我也不知道,我觉得吧,这得结合具体的业务才能评判。
所以今天,我们来看下django rest framework到底是怎么实现restful api的
难道你们不好奇吗。
还得从mixins.ListModelMixin和viewsets.GenericViewSet讲起
通过各种类的层层继承,django rest framework为我们做了很多事。
导致我们只需要继承相应的类以及适当的重载某些特性,即可实现所需的功能
我们看到,在view.py文件中,GoodsListViewSet类本身并没有指定任何方法来响应http请求
但是他继承了两个类。
我们先进入viewsets.GenericViewSet的定义看看:
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):"""The GenericViewSet class does not provide any actions by default,but does include the base set of generic view behavior, such asthe `get_object` and `get_queryset` methods."""pass
啥也没有,只是继承了另外两个类............
于是我们再来看下ViewSetMixin的定义:
class ViewSetMixin(object):"""This is the magic.Overrides `.as_view()` so that it takes an `actions` keyword that performsthe binding of HTTP methods to actions on the Resource.For example, to create a concrete view binding the 'GET' and 'POST' methodsto the 'list' and 'create' actions...view = MyViewSet.as_view({'get': 'list', 'post': 'create'})"""............
代码有很多,我一行也没考,但是从这个说明中以及可以看出一些东西了,下面,我用我CET6的水平为大家翻译一下。
这是一个魔法(这么自恋?!)。
我们重写了as_view(),实现了http请求到对资源的各种操作的绑定。
举个栗子,我们将http的get,post请求分别绑定到了list,creat上去......
emmmmm,貌似有点明白了.......
但是list,creat方法又是在哪里实现的呢?
没错,正是mixins.ListModelMixin
class ListModelMixin(object):"""List a queryset."""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 Response(serializer.data)
mixins.ListModelMixin实现了list操作,那么creat呢?
没错,是mixins.CreateModelMixin,实际上mixins.xxxxModelMixin共有5个,分别对应了不同的操作,需要时只要在类定义中继承即可。
至此,逻辑已经很清楚了。
我再来看看那个不起眼的generics.GenericAPIView到底干了啥:
class GenericAPIView(views.APIView):"""Base class for all other generic views."""# You'll need to either set these attributes,# or override `get_queryset()`/`get_serializer_class()`.# If you are overriding a view method, it is important that you call# `get_queryset()` instead of accessing the `queryset` property directly,# as `queryset` will get evaluated only once, and those results are cached# for all subsequent requests.queryset = Noneserializer_class = None
同样,我们只看说明。
他让我们重置queryset 和serializer_class这两个attributes,或者重载get_queryset()和get_serializer_class()这两个方法
从名字中看的出来,是和序列化相关的。
所以我们明白了,GoodsListViewSet继承了两个类,一个指定了http请求的响应方法,一个指定了数据的序列化方法。
我们来看个结构图:
完美~
转载于:https://www.cnblogs.com/jiage666/p/9599683.html
django rest framework------得心应手相关推荐
- 谈谈Django REST Framework(DRF)中的序列化器
摘要 Django REST Framework(DRF)是一个强大的工具,可以帮助我们构建和处理RESTful API.其中的序列化器(Serializers)是其核心组件之一,它允许我们快速有效地 ...
- 03 Django REST Framework 视图和路由
01-DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别 ...
- Django REST framework 简介
1.在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 2.在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增.删.改. ...
- Django REST framework API 指南(2):响应
Django REST framework API 指南(1):请求 Django REST framework API 指南(2):响应 Django REST framework API 指南(3 ...
- Django REST framework API 指南(12):验证器
官方原文链接 本系列文章 github 地址 转载请注明出处 验证器 大多数情况下,您在 REST framework 中处理验证时,只需依赖默认的字段验证,或者在序列化类或字段类上编写明确的验证方法 ...
- Django REST framework的一些奇巧淫技(干货!!!)
开始之前,假设你已经有Django和Django REST framework的一些基础了 mixins,ViewSet和routers配合使用 minxis的类有5种 CreateModelMixi ...
- Django REST framework快速入门
1)简介: 接口使用REST framework,REST framework是一套基于Django 的 REST 框架,是一个强大灵活的构建 Web API 的工具包. 写接口三步完成:连接数据库. ...
- Django REST framework 1
Django REST framework Django REST framework官方文档:点击 中文文档:点击 安装djangorestframework:pip3 install djang ...
- Django REST framework的各种技巧——1.基础讲解
写在最上面的话 django是一个神奇的框架,而restframework又是遵循了这个框架的另一个神奇的框架,然而由于restframework的文档稀烂无比,很多时候你必须看源码才能写出科学的代码 ...
- 在django restful framework中设置django model的property
众所周知,在django的model中,可以某些字段设置@property和setter deleter getter,这样就可以在存入数据的时候进行一些操作,具体原理请参见廖雪峰大神的博客https ...
最新文章
- BZOJ1975[Sdoi2010]魔法猪学院——可持久化可并堆+最短路树
- 《移动平台开发》第3周学习总结
- C++(STL):19---deque之删除和emplace用法
- 在Linux上安装JDK9
- php给客户端发广播,phpsocket.io如何向一个组广播?
- 《Unix/linux编程实践教程》------重定向程序的I/O
- 运行hadoop指令之——WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform....
- android selector的item属性
- day39-Spring 14-Spring的JDBC模板:DBCP连接池配置
- VS2015sql本地服务器为空,详解VS2015自带LocalDB数据库用法实例
- 启用 Windows 功能 NetFx3 时出错,错误代码: -2146498529
- 深度学习C++代码配套教程(1. 总述)
- Openresty + GeoIP2实现IP归属国家查询
- 手把手教你用Python分析微信聊天内容
- 黄河流域公安院校网络空间安全技能挑战赛 QAQ 题解
- simple-uploader.js 文档
- Redis-PHP实战篇——常用的使用场景
- Layui-颜色选择器
- 2、igraph的简单实战
- 【转】如何实现点击textbox显示monthCalendar 选择monthCalendar把值传给textbox