Python3+ Django3:自动生成Swagger接口文档

简介: Python3+ Django3:自动生成Swagger接口文档

1. 前言


当接口开发完成,紧接着需要编写接口文档。传统的接口文档通常都是使用Word或者一些接口文档管理平台进行编写,但此类接口文档维护更新比较麻烦,每次接口有变更,需要手动修改接口文档。在实际的工作中,经常会遇到:“前端抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新”。为了解决这个问题,业界推出了一个Swagger框架来管理接口文档,实现接口文档的自动更新。


采用Swagger框架来管理接口文档,常用于在微服务架构设计或者Java的后端服务工程中。这也造成了很多读者误认为Swagger只是Java语言下的一个框架,其实并不是的,Swagger除了能应用在Java语言的工程中,也同时适用于在其它语言下,比如Python。接下来,在本篇文章,介绍的就是基于Python3+Django3下,如何接入Swagger框架,并且实现Swagger接口文档的自动生成。


2. Swagger介绍


Swagger:它是一款RESTFUL接口的文档在线自动生成+功能测试并集规范于一体的工具框架,可用于生成、描述、调用和可视化RESTful风格的Web服务。总体目标是使客户端和文件系统源代码作为服务器以同样的速度来更新。当接口有变动时,对应的接口文档也会自动更新生成。


微信图片_20220524093944.png

例如:接口测试站点(http://httpbin.org/#/),也是利用Swagger来生成接口文档的。


Swagger优势:

1)Swagger可生成一个具有互动性的API控制台,开发者可快速学习和尝试API

2)Swagger支持不同客户端SDK代码,用于不同平台上(Java、Python、...)的实现

3)Swagger可在不同的平台上从代码注释中自动生成

4)Swagger社区活跃,里面有许多强悍的贡献者


3. Django项目配置


1、在开始之前,我们先创建一个项目操作目录和隔离环境,具体操作如下:

# 创建项目目录
mkdir django_swagger
cd django_swagger
# 创建隔离开发环境
python3 -m venv env
source env/bin/activate


2、安装django相关库

(env) ➜ pip install django
(env) ➜ pip install djangorestframework



3、创建django项目和app

# 创建django项目和app
django-admin startproject drf_swagger
cd drf_swagger
django-admin startapp api



需要注意的是,本篇文章示例,是基于Python3及Django当前最新库来进行的。

(env) ➜  pip list | grep django
Django               3.0.1
django-crispy-forms  1.8.1
django-formtools     2.2
django-import-export 2.0
django-reversion     3.0.5
djangorestframework  3.11.0



到此,我们已经准备好了django基础环境和生成好了项目结构。


4. Django接入Swagger


网上很多资料在介绍Django接入Swagger方法时,都是基于django-rest-swagger库进行讲解的,都殊不知,从2019年6月份开始,官方已经废弃了该库,在django 3.0中已经不支持该库了,取而代之的是全新的第三方drf-yasg库。

微信图片_20220524094147.png


GitHub地址:


https://github.com/marcgibbons/django-rest-swagger

所以本文也是基于drf-yasg库来实现在Django3中接入Swagger框架的。


1、安装drf-yasg库


pip install -U drf-yasg

GitHub项目地址:


https://github.com/axnsan12/drf-yasg


2、修改项目settings.py文件,添加api和drf_yasg。

# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'drf_yasg',
    'api',
]


3、修改api/models.py,此处定义了一个添加接口的model模型(为了方便演示)

from django.db import models
class APIInfo(models.Model):
    api_name = models.CharField(max_length=32, verbose_name="接口名称", default="请输入接口名称")
    # 接口描述
    api_describe = models.TextField(max_length=255, verbose_name="接口描述", default="请输入接口描述")
    # 接口负责人
    api_manager = models.CharField(max_length=11, verbose_name="接口负责人", default="请输入接口负责人名字")
    # 创建时间
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    # 修改时间
    update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="修改时间")
    class Meta:
        db_table = 'api_info'
        # 设置表名,默认表名是:应用名称_模型类名
        # 带有应用名的表名太长了
        verbose_name = '接口列表'
        verbose_name_plural = "接口列表"
    def __str__(self):
        return self.api_name


4、修改api/admin.py,将model注册到后台,方便在管理后台添加接口记录。

from django.contrib import admin
from . models import APIInfo
admin.site.register(APIInfo)


5、新建api/serializers.py文件,代码内容如下:

from rest_framework import serializers
from api.models import APIInfo
class APIInfoSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = APIInfo
        fields = "__all__"
class APISerializer(serializers.ModelSerializer):
    class Meta:
        model = APIInfo
        fields = "__all__"

6、修改api/view.py视图文件,并在类中,添加注释如下所示(为了方便演示):

from rest_framework import viewsets
from rest_framework import generics
from . import models
from . import serializers
class APIList(generics.ListAPIView):
    """
    查看接口列表
    """
    queryset = models.APIInfo.objects.all()
    serializer_class = serializers.APISerializer
class APIDetail(generics.RetrieveAPIView):
    """
    查看接口详细
    """
    queryset = models.APIInfo.objects.all()
    serializer_class = serializers.APISerializer
class APIDetail(generics.RetrieveUpdateDestroyAPIView):
    """
    更新接口内容
    """
    queryset = models.APIInfo.objects.all()
    serializer_class = serializers.APISerializer
class APIInfoViewSet(viewsets.ModelViewSet):
    """
        retrieve:
            返回一组(查)
        list:
            返回所有组(查)
        create:
            创建新组(增)
        delete:
            删除现有的一组(删)
        partial_update:
            更新现有组中的一个或多个字段(改:部分更改)
        update:
            更新一组(改:全部更改)
    """
    queryset = models.APIInfo.objects.all()
    serializer_class = serializers.APIInfoSerializer

7、修改项目url.py文件,进行路由配置。

from django.contrib import admin
from django.conf import settings
from django.urls import path,include
from rest_framework import routers, permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
from api import views
router = routers.DefaultRouter()
router.register('api_info', views.APIInfoViewSet)
schema_view = get_schema_view(
   openapi.Info(
      title="测试工程API",
      default_version='v1.0',
      description="测试工程接口文档",
      terms_of_service="https://www.cnblogs.com/jinjiangongzuoshi/",
      contact=openapi.Contact(email="狂师"),
      license=openapi.License(name="BSD License"),
   ),
   public=True,
   permission_classes=(permissions.AllowAny,),
)
urlpatterns = [
    path('admin/', admin.site.urls),
    # 配置django-rest-framwork API路由
    path('api/', include('api.urls')),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    # 配置drf-yasg路由
    path('^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
    path('swagger', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
    path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
]


5. 执行数据同步、运行


1、上述一切配置完成后,开始进行数据库迁移、同步。

# 生成迁文件、执行同步
python manage.py makemigrations
python manage.py migrate


2、创建后台管理员用户


python manage.py createsuperuser

3、运行服务


python manage.py runserver

6. 验证效果


1、服务运行起来后,默认端口为8000,浏览器访问http://127.0.0.1:8000/redoc/,可查看redoc ui,效果如下所示。

微信图片_20220524094545.png


2、点击左侧的api,展开各接口详细如下所示。

微信图片_20220524094608.png

PS: ReDoc 是另一个 Swagger UI 工具。


3、继续访问http://127.0.0.1:8000/swagger,即可看到日常我们熟悉的Swagger接口文档界面了。

微信图片_20220524094649.png


4、Swagger除了可以即时生成接口文档以外,还可以用于在线做一些接口功能测试,如下所示。


微信图片_20220524094724.png微信图片_20220524094746.png


5、在Swagger中还可以查看到在model定义的各字段类型及参数说明。

微信图片_20220524094824.png


到此,我们Django3接入Swagger已经完成了,更多swagger的功能使用请读者自行尝试。

声明:封面或正文部分图片来源于网络,如有侵权,请联系删除。

目录
相关文章
|
1月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
75 1
|
16天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
103 45
|
17天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
29 2
|
20天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
28 1
|
2月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
119 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
24 4
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【10月更文挑战第10天】本文比较了Python中三个最受欢迎的Web框架:Django、Flask和Pyramid。Django以功能全面、文档完善著称,适合快速开发;Flask轻量灵活,易于上手;Pyramid介于两者之间,兼顾灵活性和安全性。选择框架时需考虑项目需求和个人偏好。
33 1
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【10月更文挑战第6天】本文比较了Python中三个最受欢迎的Web框架:Django、Flask和Pyramid。Django功能全面,适合快速开发;Flask灵活轻量,易于上手;Pyramid介于两者之间,兼顾灵活性和可扩展性。文章分析了各框架的优缺点,帮助开发者根据项目需求和个人偏好做出合适的选择。
34 4
|
2月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
102 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
90 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台