rest_framework基础
2024-08-27 16:10:32
简介
为什么要使用REST framework?
Django REST framework 是一个强大且灵活的工具包,用以构建Web APIs。
- 在线可视的API,对于赢得你的开发者们十分有用
- 验证策略涵盖了OAuth1a和OAuth2
- 同时支持ORM和非ORM数据源的序列化
- 可以配置各个环节,若无需更多强大的特性,使用一般基于类(function-based)的视图(views)即可
- 大量的文档,强力的社区支持
- 大公司如同Mozilla和Eventbrite,也是忠实的使用者
配置要求
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
最新文章
- DevExpress VCL v16.1.3发布
- Addthis
- C#可扩展编程之MEF学习笔记(三):导出类的方法和属性
- 001_从原理上搞定编码-- Base64编码
- Xamarin.Android开发实践(十二)
- BZOJ2905 : 背单词
- Java I/O NIO学习
- JS Array常用方法indexOf/filter/forEach/map/reduce详解
- CODEVS 1287 矩阵乘法
- 《JavaScript 闯关记》之 DOM(上)
- 有一种acm题目叫做,奇葩!
- 地精排序(Gnome Sort) 算法
- crontab 的例子
- 【WPF】三维模型中的“照相机”
- Edison与Arduino通过USB对接通信
- 【源码分享】mui实现简单的手机音乐播放器
- @synchronized(self)
- ThreadLocal<;T>;学习总结
- LeetCode 15. 3Sum 16. 3Sum Closest 18. 4Sum
- php处理数据分组问题
热门文章
- 字体在mac win 系统如何优雅的展示
- jQuery $ 的作用
- vue bus方式解决非父子组件间的传值
- Delphi的FIFO实现
- 触摸屏之linux3.4.2安装tslib
- Python学习:20.Python网络编程(Socket)
- 版本控制工具(下)——Git的远程仓库、分支管理与其它操作
- 2016-2017-2 20155227实验二《Java面向对象程序设计》实验报告
- 学号20155311 2016-2017-2 《Java程序设计》第4周学习总结
- 20155325 2016-2017-2 《Java程序设计》第九周学习总结