简介

为什么要使用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. docker故障问题修复

    systemctl start docker启动 systemctl restart docker重启 执行 vi /etc/sysconfig/selinux , 把 selinux 属性值改为di ...

  2. 运行TensorFlow报错,“This program requires version 3.6.1 of the Protocol Buffer runtime library, but the installed version is 3.0.0.”

    报错信息: [libprotobuf FATAL google/protobuf/src/google/protobuf/stubs/common.cc:67] This program requir ...

  3. ruby 生成随机字符串

    rand(36 ** n).to_s(36) n 等于任意数字

  4. 加法变乘法——第六届蓝桥杯C语言B组(省赛)第六题

    原创 加法变乘法 我们都知道:1+2+3+ ... + 49 = 1225现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如:1+2+3+...+10*11+12+...+27*28+ ...

  5. PAT (Advanced Level) Practice 1003 Emergency

    思路:用深搜遍历出所有可达路径,每找到一条新路径时,对最大救援人数和最短路径数进行更新. #include<iostream> #include<cstdio> #includ ...

  6. Linux入门第二天——基本命令入门(下)

    一.帮助命令 1.帮助命令:man (是manual手册的缩写,男人无所不能,/笑哭) 更多man用法以及man page的用法,参见:http://www.linuxidc.com/Linux/20 ...

  7. 20155212 2016-2017-2 《Java程序设计》第4周学习总结

    20155212 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 Chapter 6 继承基本上就是避免多个类间重复定义共同行为. private成员会被继承 ...

  8. 20155230 《Java程序设计》实验一(Java开发环境的熟悉) 实验报告

    练习题: 凯撒密码: import java.util.Scanner; import java.io.*; public class exp1 { public static void main(S ...

  9. # 20155236 2016-2017-2 《Java程序设计》第二周学习总结

    20155236 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 对于类型.变量.运算符.流程控制等等的学习.在其中包含着基本的语法元素,还有基本的逻辑语句. ...

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

    20155304 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是 ...