此篇幅中止更新,将替换为DRF扩展使用方式,敬请期待 ~ python
Django REST framework 是用于构建Web API 的强大而灵活的工具包。git
咱们可能想使用REST框架的一些缘由:github
安装需求以及安装及使用django
REST framework 兼容版本:api
安装
浏览器
# 若是使用的是python3 pip3 install djangorestframework pip3 install markdown pip3 install django-filter # 或者经过github安装 git clone git@github.com:encode/django-rest-framework.git
使用markdown
# 添加 "rest_framework" 到Django settings.py文件中INSTALLED_APPS, INSTALLED_APPS = ( ... 'rest_framework', ) # 若是打算使用可浏览的API。还须要添加REST framework的登陆和注销视图。将如下内容添加到根url.py文件中,命名空间必须保留,路由能够设置为本身想要的。 urlpatterns = [ ... url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) ]
接下来,能够举个例子app
REST framework API的任何全局设置都保存在一个名为restframework的配置字典中。首先在设置中添加如下内容框架
REST_FRAMEWORK = { # 使用Django的 `django.contrib.auth` 权限验证, # 或者容许对未经身份验证的用户进行只读访问. 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' ] }
# 别忘记在 installedapps上添加了restframework。 # 如今已经准备好建立API了。这是项目的根 url.py 模块 from django.conf.urls import url, include from django.contrib.auth.models import User from rest_framework import routers, serializers, viewsets # 序列化model模型展现. class UserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ('url', 'username', 'email', 'is_staff') # ViewSets定义视图行为. class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer # 路由器提供一种简单的方法来自动肯定URL的设置(使用注册的方式). router = routers.DefaultRouter() router.register(r'users', UserViewSet) # 使用自动URL路由链接API. # 此外,还包括可浏览的API的登陆url. urlpatterns = [ url(r'^', include(router.urls)), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) ]
如今,能够在浏览器中打开该API,http://127.0.0.1:8000/,并查看新的“用户”API。若是你在右上角使用登录控制也能够从系统中添加,建立和删除用户。工具
接下来了解下rest framework 的全部组件,而且得知它们是如何组合在一块儿的,这是很是值得去学习的。
1、Serialization 序列化
这里呢,不对普通的序列化做介绍。接下来咱们使用下 ModelSerializers
model序列化让咱们写的代码更少,更简介。Django提供了form和modelform同样,REST框架包括了序列化器类和模型序列化器类。
例如 models 文件中有一个关于文章的表
class Article(models.Model): """文章资讯""" title = models.CharField(max_length=255, unique=True, db_index=True, verbose_name="标题") source = models.ForeignKey("ArticleSource", verbose_name="来源") article_type_choices = ((0, '资讯'), (1, '视频')) article_type = models.SmallIntegerField(choices=article_type_choices, default=0) brief = models.TextField(max_length=512, verbose_name="摘要") head_img = models.CharField(max_length=255) content = models.TextField(verbose_name="文章正文") pub_date = models.DateTimeField(verbose_name="上架日期") offline_date = models.DateTimeField(verbose_name="下架日期") status_choices = ((0, '在线'), (1, '下线')) status = models.SmallIntegerField(choices=status_choices, default=0, verbose_name="状态") order = models.SmallIntegerField(default=0, verbose_name="权重", help_text="文章想置顶,能够把数字调大") comment_num = models.SmallIntegerField(default=0, verbose_name="评论数") agree_num = models.SmallIntegerField(default=0, verbose_name="点赞数") view_num = models.SmallIntegerField(default=0, verbose_name="观看数") collect_num = models.SmallIntegerField(default=0, verbose_name="收藏数") tags = models.ManyToManyField("Tags", blank=True, verbose_name="标签") date = models.DateTimeField(auto_now_add=True, verbose_name="建立日期") def __str__(self): return "%s-%s" % (self.source, self.title)
接下来,只须要写一个序列化器,即可以轻松对数据的进行获取,并且代码看起来特别简洁。
# 在 serilallzer.py 文件能够这样写 # 若是想使用哪一个model进行序列化,照此类推便可 # fields 若是想要获取全部字段, 使用"__all__" # fields 若是只是想要获取一部分数据呢, 那么在 fields 中加入所序列化的model的字段便可 from rest_framework.serializers import ModelSerializer class ArticleSerializer(ModelSerializer): class Meta: model = models.Article fields = ("id", "title", "article_type", "content", ) or "__all__"
2、Requests & Response (请求 & 响应 )
更新中...
3、Class-based views 基于类的视图
可使用基于类的视图编写API,而且能够重用不少公共的功能,并帮助保持代码的可重用性。
rest_framework封装原有django的CBV模式下的View,提供了更高级的接口使用。
# 它们一共五层view视图封装, 结构以下(这里统筹了API, 并不只仅有这些接口类, 还有更多的细化 ) from django.views import View from rest_framework.views import APIView from rest_framework.generics import GenericAPIView from rest_framework.viewsets import GenericViewSet from rest_framework.viewsets import ModelViewSet
那么接下来写请求视图类,即可以对应符合对应本身视图方法来继承它们, e.g
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import authentication, permissions from django.contrib.auth.models import User class ListUsers(APIView): # API策略属性 authentication_classes = () # 认证(用户是否须要登录认证, ) permission_classes = () # 权限 renderer_classes = () # 返回渲染器 parser_classes = () # 解析器 throttle_classes = () # 节流检查器 content_negotiation_class = () # 内容协商器