• Django Rest framework


    介绍

    Django REST framework 是用于构建Web API 的强大而灵活的工具包。

    我们可能想使用REST框架的一些原因:

    • Web浏览API对于开发人员来说是一个巨大的可用性。
    • 认证策略包括OAuth1a和OAuth2的包。
    • 支持ORM和非ORM数据源的序列化。

    安装需求以及安装及使用

    REST framework 兼容版本:

    • Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)
    • Django (1.8, 1.9, 1.10, 1.11)

    安装

    # 如果使用的是python3
    
    pip3 install djangorestframework
    pip3 install markdown   
    pip3 install django-filter 
    
    # 或者通过github安装
    
    git clone git@github.com:encode/django-rest-framework.git

    使用

    # 添加 "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'))
    ]

    接下来,可以举个例子

    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组件详解

    接下来了解下rest framework 的所有组件,并且得知它们是如何组合在一起的,这是非常值得去学习的。

    • 1 - Serialization 序列化
    • 2 - Requests & Responses 请求 & 响应
    • 3 - Class-based views 基于类的视图
    • 4 - Authentication & permissions 身份验证 & 权限
    • 5 - Relationships & hyperlinked APIs
    • 6 - Viewsets & routers 视图和路由
    • 7 - Schemas & client libraries 模式和客户端库(虚位以待~)

    一, 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__"

    二, 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 = ()  # 内容协商器
  • 相关阅读:
    mysql连接error,Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection .....
    ng-model绑定的是ng-option中的什么?
    js的原型prototype究竟是什么?
    git给log设置别名来快速查看友好的log信息
    git常见使用场景总结
    $http设置headers来实现IE不缓存url请求的资源
    给sublime设置格式化代码的快捷键
    HTTP权威指南 ·
    《编写高质量代码:Web 前端开发修炼之道》 笔记与读后感
    怎么删除git本地分支以及Bitbucket的远程分支?
  • 原文地址:https://www.cnblogs.com/lovezwfjc/p/9951018.html
Copyright © 2020-2023  润新知