1.介绍:
RESTful API是指符合REST风格的Web接口
具体来说就是将所有被请求的实体当作资源,通过HTTP自带的方法(GET, HEAD, POST, PUT, DELETE)来进行对应的增删改查等操作。比如:
获取用户列表:GET /user/
获取id为1的用户资源:GET /user/1/
创建一个用户:POST /user/ 再加上body中传输的数据
更新id为1的用户信息:PUT /user/1/ 再加上body中的数据
DELETE用来删除,用法同PUT
2.数据格式
关于传输数据的格式,在django-rest-framework中默认接受的数据格式是JSON,也可以通过HTTP请求中headers中的content-type来设定格式,django-rest-framework会据此进行对应的解析
3.使用场景
在开发一套web系统之后,可能需要再提供一套接口给H5端或客户端使用,也可能是第三方系统使用,在已开发好的系统上开发RESTful接口是一件十分容易的事,但需要权衡业务对性能的要求
4.使用
django-rest-framework的实现类似于django中的View+Form,其中Serializer跟Form的用法很像
1.安装
pip install djangorestframework==3.8.2
pip install coreapi==2.3.3 # 提供接口文档库
然后将rest_framework放入INSTALLED_APPS中
2.编写Serializer序列化数据,在对应APP下新增 serializers.py
Serializer跟Form的用法很像,我们定义的PostSerializer中可以继续实现自定义字段,自定义检验逻辑,自定义数据处理等方法
from rest_framework import serializers
from .models import Post
# 序列化数据,用法类似Form
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['title', 'category', 'desc', 'content_html', 'created_time']
3.新建View层逻辑,对应app下新建 apis.py
from rest_framework import generics
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Post
from .serializers import PostSerializer
# 将一个View转化为API View的装饰器,提供可选参数来限制请求类型
# api_view(['GET', 'POST'])
@api_view()
def post_list(request):
posts = Post.objects.filter(status=Post.STATUS_NORMAL)
post_serializers = PostSerializer(posts, many=True)
return Response(post_serializers.data)
# 类似View层中的ListView,只需指定queryset和用来序列化的类即可实现数据列表页
# ListCreateAPIView可以接受POST请求,另外还有一个ListAPIView仅支持GET请求
class PostList(generics.ListCreateAPIView):
queryset = Post.objects.filter(status=Post.STATUS_NORMAL)
serializer_class = PostSerializer
4.配置 urls.py :配置RESTful接口和接口文档
from blog.apis import post_list, PostList
urlpatterns = [
# ......
url(r'^api/post/', post_list, name='post-list'),
# url(r'^api/post/', PostList.as_view(), name='post-list'),
]
此时已配置好列表页的RESTful接口,可通过地址访问:
http://127.0.0.1:8000/api/post/?format=json
django-rest-framework会通过访问类型(Content-Type)来渲染对应类型的结果,如果不加format=json,用浏览器访问时会默认渲染为页面
5.配置通用接口
以上的接口仅能实现列表页,为针对每个资源的CRUD操作,django-rest-framework封装了一个更上层的抽象类ViewSet,可在一个类中实现所有的操作
1.修改 apis.py
from rest_framework import viewsets
from rest_framework.permissions import IsAdminUser
from .models import Post
from .serializers import PostSerializer
# 如果是只读接口,可以继承自 viewsets.ReadOnlyModelViewSet
class PostViewSet(viewsets.ModelViewSet):
serializer_class = PostSerializer
queryset = Post.objects.filter(status=Post.STATUS_NORMAL)
# 如果有写入的需求,那写入端应当要取得 CSRF_TOKEN
# permission_classes = [IsAdminUser] # 写入时的权限校验
2.配置 urls.py
django-rest-framework提供router组件来生成一整套的接口
from rest_framework.routers import DefaultRouter
from blog.apis import PostViewSet
from rest_framework.documentation import include_docs_urls
router = DefaultRouter()
router.register(r'post', PostViewSet, base_name='api-post')
urlpatterns = [
# 此url将提供多个接口,如: 列表页:/api/post/ 详情页:/api/post/<post_id>/
url(r'^api/', include(router.urls,)),
# api文档接口
url(r'^api/docs/', include_docs_urls(title='blogidea apis')),
reverse(‘api:post-list’)和reverse(‘api:post-detail’,args=[1])可以反向解析出列表页和详情页
在PostViewSet的某个方法中,可以通过self.reverse_action(‘list’)获得列表页地址,self.reverse_action(‘detail’, args=[]来获得详情页接口地址
3.接口文档
文档配置依赖包:pip install coreapi==2.3.3
通过/api/docs/打开即可查看,可以在PostViewSet中书写文档说明,这个也会显示在接口文档中