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,不积跬步,无以至千里。

猜你喜欢

转载自www.cnblogs.com/liudinglong/p/12602501.html