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