简介

为什么要使用REST framework?

Django REST framework 是一个强大且灵活的工具包,用以构建Web APIs。

在线可视的API,对于赢得你的开发者们十分有用 
验证策略涵盖了OAuth1aOAuth2 
- 同时支持ORM非ORM数据源的序列化 
- 可以配置各个环节,若无需更多强大特性,使用一般基于类(function-based)的视图(views)即可 
大量的文档,强力的社区支持 
- 大公司如同MozillaEventbrite,也是忠实的使用者

配置要求

REST framework 有以下的要求:

  • Python (2.7, 3.2, 3.3, 3.4, 3.5)
  • Django (1.7+, 1.8, 1.9)

下面是可选的包:

  • Markdown (2.1.0+) - Markdown为可视化 API 提供了支持.
  • django-filter (0.9.2+) - 过滤支持.
  • django-crispy-forms - 为过滤,提供了改良的HTML呈现.
  • django-guardian (1.1.1+) - 对象层面的权限支持.

安装与配置

安装

pip install djangorestframework
pip install markdown # 可选依赖包
pip install django-filter # 可选依赖包

配置

INSTALLED_APPS = (
...
'rest_framework',
) REST_FRAMEWORK = {
# 编码格式
'UNICODE_JSON': False,
}

基本使用方法

models.py

from django.db import models

class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
def __str__(self):
return self.name

urls.py

from django.conf.urls import url
from django.contrib import admin
from rest_demoimport views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^authors/$', views.AuthorsView.as_view()),
url(r'^authors/(\d+)/$', views.AuthorsDetailView.as_view()),
]

serializer.py

from rest_framework import serializers
from rest_demo import models class AuthorModelSerializers(serializers.ModelSerializer):
class Meta:
model = models.Author
fields = '__all__'

views.py

from rest_demo import serializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_demo import models class AuthorsView(APIView):
def get(self,request):
'''
查询所有作者
:param request:
:return:
'''
author_list = models.Author.objects.all()
auts = serializer.AuthorModelSerializers(author_list,many=True)
return Response(auts.data) def post(self,request):
'''
添加作者
:param request:
:return:
'''
auts = serializer.AuthorModelSerializers(data=request.data)
if auts.is_valid():
auts.save()
return Response(auts.data)
return Response(auts.errors) class AuthorsDetailView(APIView):
def get(self,request,id):
'''
查询单条作者
:param request:
:param id:
:return:
'''
author = models.Author.objects.filter(pk=id).first()
auts = serializer.AuthorModelSerializers(author)
return Response(auts.data) def put(self,request,id):
'''
修改单条作者
:param request:
:param id:
:return:
'''
author = models.Author.objects.filter(pk=id).first()
auts = serializer.AuthorModelSerializers(instance=author,data=request.data)
if auts.is_valid():
auts.save()
return Response(auts.data)
return Response(auts.errors) def delete(self,request,id):
'''
删除单条作者
:param request:
:param id:
:return:
'''
models.Author.objects.filter(pk=id).delete()
return Response()

  

封装

继承mixin包下面的类

from rest_framework import mixins
from rest_framework import generics
class PublishView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):
queryset = models.Publish.objects.all()
serializer_class = serializer.PublishSerializers 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 PublishDetailView(mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin,generics.GenericAPIView):
queryset = models.Publish.objects.all()
serializer_class = serializer.PublishSerializers def 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)

  这个时候,我们只需要提供queryset和serializer_class两个参数配置,mixin包下面的类会帮我们处理数据,我们调用对应的方法并且将其返回值返回即可,

但是需要注意的是,如果使用此方法,urls.py的url对应的id要命名为pk,如下:

    url(r'^publishes/$', views.PublishView.as_view()),
url(r'^publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view()),

  但是,即使我们用了这种封装,很多代码还是有重复的,所有,rest_framework又给我们做了一层封装

继承generices包下面的类

只需要改变一下XXXView类的继承类

from rest_framework import generics
class PublishView(generics.ListCreateAPIView):
queryset = models.Publish.objects.all()
serializer_class = serializer.PublishSerializers class PublishDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = models.Publish.objects.all()
serializer_class = serializer.PublishSerializers

  这样,代码就清晰很多了,但是,这种方法依然是将一个model表分成两个视图,那,有没有一种方法能将他们合并在一起呢?

继承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

from rest_framework import viewsets
class BookhViewSet(viewsets.ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = serializer.PublishSerializers

  

  

rest_framework基础的更多相关文章

  1. rest_framework知识总汇

    RESTful规范 rest_framework基础 rest_framework基本组件(权限.认证.频率) rest_framework渲染器 rest_framework版本控制 解析器.路由控 ...

  2. 初撩RESTful

    1. 什么是RESTful? 一种软件架构风格,设计风格,用于客户端和服务端交互类的架构. 一组架构约束条件和原则 2. 什么是RESTful架构? 客户端通过http动词(get/post等)对服务 ...

  3. django的rest_framework框架源码剖析

    在看源码之前先了解一下什么是rest,restful api. 什么是rest 可以总结为一句话:REST是所有Web应用都应该遵守的架构设计指导原则. REST是Representational S ...

  4. Rest_framework Router 路由器(含SimplyRouter源码浅解)

    目录 Rest_framework Router 路由器 ViewSet结合Router,自动生成url. 将ViewSet注册到Router中,需要三个要素: 关于路由规则,细分有四类: rest_ ...

  5. rest_framework框架的认识

    它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架. 一  路由 可以通过路由as_view()传参 根据请求方式的不同执行对应不同的方法 在routers模块下 封装了很多关于 ...

  6. Django Rest framework基础使用之View:APIView, mixins, generic, viewsets

    先看一张图,对DRF的各个APIView,Mixin,Viewset等有个基本印象: 具体使用方法: 1.APIView: DRF 的API视图 有两种实现方式: 一种是基于函数的:@api_view ...

  7. rest_framework之视图及源码剖析

    最初形态(工作中可能会使用) 引子 Django的CBV我们应该都有所了解及使用,大体概括一下就是通过定义类并在类中定义get post put delete等对应于请求方法的方法,当请求来的时候会自 ...

  8. django rest_framework 序列化组件详解

    为什么要用序列化组件 当我们做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到 ...

  9. 一: DRF web应用框架基础,及序列化器的使用

    ---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...

随机推荐

  1. 浅析中国剩余定理(从CRT到EXCRT))

    前置知识 1. a%b=d,c%b=e, 则(a+c)%b=(d+e)%b(正确性在此不加证明) 2. a%b=1,则(d\(\times\)a)%b=d%b(正确性在此不加证明) 下面先看一道题(改 ...

  2. [Linux]使用宝塔面板做负载均衡时遇到的问题和解决办法

    最近公司的小程序因为高峰期访问缓慢的问题,打算用负载均衡试试.本人是个新手,在网上找了几篇负载均衡的文章看了看,最后还是用了宝塔面板的负载均衡插件...这个服务器我也是刚刚接手,很多东西都是以前的同事 ...

  3. flAbsPath on /var/lib/dpkg/status failed 解决 Cydia 红字

    越狱之后抹掉所有数据,然后再使用 doubleH3lix 越狱成功后,打开 Cydia 会提示如下错误: flAbsPath on /var/lib/dpkg/status failed - real ...

  4. ES6学习之-let 和const命令

    let 和const命令 let命令 用来声明变量,类似于var .let声明的变量 只在let命令所在的代码块内有效. 在for循环里也是如此 每次循环其实都是一个代码块 function fn() ...

  5. hexo博客更换主题

    前边我们已经学会了博客的搭建了,这次我们来看看怎么样让我们的博客更漂亮,更个性化.那就是来更换博客的主题,让我们的博客与众不同起来.我们可以去hexo的主题官网去挑选你自己喜欢的主题风格.里边收录了很 ...

  6. BigData:值得了解的十大数据发展趋势

    当今,世界无时无刻不在发生着变化.对于技术领域而言,普遍存在的一个巨大变化就是为大数据(Big data)打开了大门,并应用大数据技相关技术来改善各行业的业务并促进经济的发展.目前,大数据的作用已经上 ...

  7. mysql底层实现

    MySQL 的常用引擎 1. InnoDB InnoDB 的存储文件有两个,后缀名分别是 .frm 和 .idb,其中 .frm 是表的定义文件,而 idb 是数据文件. InnoDB 中存在表锁和行 ...

  8. Go语言 异常panic和恢复recover用法

    Go语言 异常panic和恢复recover用法 背景:Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在 ...

  9. 20155330 2016-2017-2 《Java程序设计》第十周学习总结

    20155330 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 学习目标 了解计算机网络基础 掌握Java Socket编程 理解混合密码系统 掌握Java ...

  10. 20155336 2016-2017-2《JAVA程序设计》第一周学习总结

    # 20155336  2016-2017-2<JAVA程序设计>第1周学习总结 ## 教材学习内容总结 开学的第一周,带着些许的欣喜和好奇,听完了老师的第一堂课.说心里话学习JAVA仿佛 ...