簡介
為什么要使用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
