Django开发博客——RESTful

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中书写文档说明,这个也会显示在接口文档中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值