zoukankan      html  css  js  c++  java
  • Django REST Framework 集成系统API

      引言

      基于Django REST Framework教程(一分钟入门)文章后,继续讲一下如何集成开发系统的API。之前在文章中讲过web接口开发,那种手写代码显然又慢又不整洁,利用rest framework工具可以快速形成API。

      项目结构

      打开cmd,输入

    tree django_restAPI /F
    

      创建模型

      之前开发web接口虽然没讲创建模型,但是实际上已经存在模型,因为开发系统时就已经将数据模型创建了,如:Event和Guest。

    这里的话,我们是另外开设一个项目,所以依然也要创建,如图:

    from django.db import models
    
    # Create your models here.
    
    # 发布会
    class Event(models.Model):
        name = models.CharField(max_length=100)
        limit = models.IntegerField()
        status = models.BooleanField()
        address = models.CharField(max_length=200)
        start_time = models.DateTimeField('events time')
        create_time = models.DateTimeField(auto_now=True)
    
        def __str__(self):
            return self.name
    
    # 嘉宾
    class Guest(models.Model):
        event = models.ForeignKey('Event',on_delete=models.CASCADE)
        realname = models.CharField(max_length=64)
        phone = models.CharField(max_length=16)
        email = models.EmailField()
        sign = models.BooleanField()
        create_time = models.DateTimeField(auto_now=True,db_column='create_time')
    
        class Meta:
            unique_together = ('phone','event')
    
        def __str__(self):
            return self.realname
    

      模型Event和Guest就是对应数据库中表及所设计的字段。

      创建序列化器

      有了数据,当然就是数据以什么形式展示出来,DRF ( Django RestFramework ) Serializer的序列化方式可以类比Django的ModelForm组件的使用

    当涉及到一对多或者多对多字段时,我们可以通过自定制操作来获得我们想要的数据形式。
    # 定义好了 Models,我们可以开始写 Serializers,这个相当于 Django 的 Form
    from rest_framework import serializers
    from api.models import Event,Guest
    
    # 定义API表现形式,序列化或反序列化模型
    class EventSerializer(serializers.ModelSerializer):
        class Meta:
            model = Event # 定义关联的 Model
            fields = ('url','name','address','start_time','limit','status')  # 指定返回的 fields
    
    class GuestSerializer(serializers.ModelSerializer):
        class Meta:
            model = Guest # 定义关联的 Model
            fields = ('url','realname','phone','email','sign','event')  # 指定返回的 fields
    
    # 以上就是定义一个Serializer最简单的代码,model指定对应的模型实体,fields指定要序列化的数据域(可理解为数据库表的某一列)
    

      

      视图集

      确定了数据展现形式,那么就是视图集:ViewSets。在Django中使用基于类的视图(ClassView),类中所定义的方法名称与Http的请求方法相对应,才能基于路由将请求分发(dispatch)到ClassView中的方法进行处理,而Django REST framework中可以突破这一点,通过ViewSets可以实现自定义路由。

    简单点说,DRF的Viewsets就允许你将一批功能类似或者有流程的接口写在一个类里面。

    from django.shortcuts import render
    
    # Create your views here.
    
    from rest_framework import viewsets
    from api.serializers import,EventSerializer,GuestSerializer
    from api.models import Event,Guest
    
    
    
    class EventViewSet(viewsets.ModelViewSet):
        queryset = Event.objects.all() # 指定结果集
        serializer_class = EventSerializer # 指定序列化的类
    
    class GuestViewSet(viewsets.ModelViewSet):
        queryset = Guest.objects.all()
        print(queryset,111)
        serializer_class = GuestSerializer
        print(serializer_class,222)
    

      

      路由注册

      上面已经说过ViewSet类可以实现自定义注册路由,并通过Router 类自动处理连接视图和URL的资源。

    from django.conf.urls import url, include
    from rest_framework import routers
    from api import views
    
    router = routers.DefaultRouter() # 定义路由地址
    router.register(r'users', views.UserViewSet) # 注册新的路由地址
    router.register(r'groups', views.GroupViewSet) # 注册新的路由地址
    router.register(r'events', views.EventViewSet) # 注册新的路由地址
    router.register(r'guests', views.GuestViewSet) # 注册新的路由地址
    
    from rest_framework.documentation import include_docs_urls
    API_TITLE = 'XX系统API文档'
    API_DESCRIPTION = '关键业务接口文档'
    
    # 使用自动URL路由连接我们的API。
    # 另外,我们还包括支持浏览器浏览API的登录URL。
    urlpatterns = [
        url(r'^', include(router.urls)),
        url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
        path('admin/', admin.site.urls),
    ]
    

      数据迁移

      我这里就没使用mysql数据库了,当然你可以使用,执行命令:

    python manage.py makemigrations
    python manage.py migrate
    

      登录系统

     详细功能介绍:

     删除和修改的功能:

      自动生成API文档

      执行依赖安装

    pip install coreapi pygments markdown
    

      安装上面依赖包后,只要修改urls.py文件即可:

    from rest_framework.documentation import include_docs_urls
    API_TITLE = 'XX系统API文档'
    API_DESCRIPTION = '关键业务接口文档'
    
    # 使用自动URL路由连接我们的API。
    # 另外,我们还包括支持浏览器浏览API的登录URL。
    urlpatterns = [
        url(r'^', include(router.urls)),
        url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
        path('admin/', admin.site.urls),
        path(r'docs/', include_docs_urls(title=API_TITLE, description=API_DESCRIPTION, authentication_classes=[],
                                         permission_classes=[])),
        url(r'^test1/$', views.test1),
    
    ]
    

      

      其中authentication_classess是认证,permission_classes 是权限。这里就先不讲这两个东西了。

    配置好后直接重启程序,浏览器输入:http://127.0.0.1:1334/docs/

    测试一下:

    以上就是接口新增,修改,删除和查询的操作,下面补充一点知识:

    1.关于前后端分离,可以参考我csdn的文章:https://blog.csdn.net/liudinglong1989/article/details/104321325

    2.REST(Representational State Transfer):表现层状态转移,一种软件架构风格,不是标准。既然不是标准,我可以遵守,也可以不遵守!!

    3.什么是RESTful? RESTful是一种开发理念,基于REST构建的API就是Restful风格,称之为RESTful框架。

    4.表示API的具体网址,每个网站代表一种资源

    • 资源作为网站,不能有动词,而且所用的名词往往与数据库的表名对应

    • API中的名词应该使用复数,无论子资源或者所有资源

    • 动词:

    • GET(SELECT):从服务器取出资源(一项或多项)。

    • POST(CREATE):在服务器新建一个资源。

    • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。

    • DELETE(DELETE):从服务器删除资源。

      附录

      以上就是集成系统API的案例,这些远远还不够,但带你入门是绰绰有余了,如果深入学习,可以研究官网文档。

      如果对python测试开发相关技术感兴趣的伙伴,欢迎加入测试开发学习交流QQ群:696400122,不积跬步,无以至千里。

  • 相关阅读:
    html5存储相关 coookie localstorage session storage
    LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)
    LeetCode 331. 验证二叉树的前序序列化(Verify Preorder Serialization of a Binary Tree) 27
    LeetCode 1047. 删除字符串中的所有相邻重复项(Remove All Adjacent Duplicates In String)
    LeetCode 151. 翻转字符串里的单词(Reverse Words in a String)
    【剑指offer】面试题 31. 栈的压入、弹出序列
    LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)
    LeetCode 946. 验证栈序列(Validate Stack Sequences) 26
    【剑指offer】面试题 14. 剪绳子
    LeetCode 343. 整数拆分(Integer Break) 25
  • 原文地址:https://www.cnblogs.com/liudinglong/p/12602501.html
Copyright © 2011-2022 走看看