Django自动生成Swagger接口文档 —— Python

news2025/1/11 15:07:20

1. 前言

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

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

2. Swagger介绍

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

例如:接口测试站点(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库。

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、创建后台管理员用户

代码语言:javascript

复制

python manage.py createsuperuser

3、运行服务

​python manage.py runserver

6. 验证效果

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

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

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

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

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

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

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

本次分享到此结束,感谢大家的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1897841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不错的用户需求访谈方法

不错的用户需求访谈方法&#xff0c;可以用如下的矩阵&#xff0c;用来引导用户访谈&#xff1a;

产科管理系统 专科电子病历系统源码,前后端分离架构,多家医院产科广泛运用,系统稳定,功能齐全

产科管理系统 专科电子病历系统源码&#xff0c;前后端分离架构&#xff0c;多家医院产科广泛运用&#xff0c;系统稳定&#xff0c;功能齐全 产科管理系统&#xff0c;特别是产科信息管理系统&#xff08;Obstetrical Information Management System&#xff0c;简称OIMS&…

NXP i.MX8系列平台开发讲解 - 3.18 Linux tty子系统介绍(一)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 1. TTY 起源 2. Linux 系统中的TTY 2.1 Linux TTY 设备形式 2.2 Linux TTY framework 2.3 驱动核心相关文件…

一键直达:2024最新Win10系统安装包!快来下载!

对于想体验Win10系统最新功能的用户来说&#xff0c;寻找可靠的最新系统安装包是特别重要的。接下来系统之家小编就给大家带来2024年最新Win10系统安装包&#xff0c;有需要的小伙伴一键点击就能开始下载。该系统安装步骤简单易懂&#xff0c;无需担心任何装机经验。 推荐下载&…

浅谈k8s中cni0和docker0的关系和区别

最近在复习k8s网络方面的知识&#xff0c;查看之前学习时整理的笔记和文档还有过往自己总结的博客之后发现一个问题&#xff0c;就是在有关flannel和calico这两个k8s网络插件的文章和博客中&#xff0c;会涉及到cni0和docker0这两个网桥设备&#xff0c;但是都没有明确说明他们…

AIGI赋能未来:人工智能如何重塑电子电路学习体验

文章目录 一、掌握基础知识与技能1. 扎实理论基础2. 熟练使用工具 二、融合AI技术提升学习效率1. 利用AI辅助学习平台2. 应用AI工具进行电路设计与仿真 三、探索创新应用方向1. 关注AI与电子电路的交叉领域2. 参与开源项目和竞赛 四、培养跨学科思维1. 加强数学与计算机科学知识…

单机多网卡互通——问题跟踪+工具分析

一、背景 想搭建soft ROCE(RXE)与实体ROCE设备互联的测试环境&#xff0c;为了节省机器以及使用方便&#xff0c;预想在配备ROCE卡的主机上&#xff0c;用另一个网卡绑定soft ROCE&#xff0c;然后互通。 [ETH1 ROCE] <--------------------> [ETH2 RXE] 二、问题跟…

【qt】如何获取网卡的信息?

网卡不只一种,有有线的,有无线的等等 我们用QNetworkInterface类的静态函数allInterfaces() 来获取所有的网卡 返回的是一个网卡的容器. 然后我们对每个网卡来获取其设备名称和硬件地址 可以通过静态函数humanReadableName() 来获取设备名称 可以通过静态函数**hardwareAddre…

TC3xx NvM小细节解读

目录 1.FlsLoader Driver和FlsDmu Driver 2. FlsLoader小细节 3.小结 大家好&#xff0c;我是快乐的肌肉&#xff0c;今天聊聊TC3xx NvM相关硬件细节以及MCAL针对NvM的驱动。 1.FlsLoader Driver和FlsDmu Driver 在最开始做标定的时候&#xff0c;认为标定数据既然是数据&…

Java传引用问题

本文将介绍 Java 中的引用传递&#xff0c;包括其定义、实现方式、通过引用修改原来指向的内容和通过引用修改当前引用的指向的区别 目录 1、引用传递的概念 2、引用传递的实现方式 3、传引用会发生的两种情况&#xff1a; 通过引用修改当前引用的指向 通过引用修改原来指…

C++基础(七):类和对象(中-2)

上一篇博客学的默认成员函数是类和对象的最重要的内容&#xff0c;相信大家已经掌握了吧&#xff0c;这一篇博客接着继续剩下的内容&#xff0c;加油&#xff01; 目录 一、const成员&#xff08;理解&#xff09; 1.0 引入 1.1 概念 1.2 总结 1.2.1 对象调用成员函数 …

人工智能系列-NumPy(二)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 链接数组 anp.array([[1,2],[3,4]]) print(第一个数组&#xff1a;) print(a) print(\n) bnp.array([[5,6],[7,8]]) print(第二个数组&#xff1a;) print(b) print(\n) print…

web基础与HTTP协议(企业网站架构部署与优化)

补充&#xff1a;http服务首页文件在/var/www/html下的&#xff0c;一定是index.html命名的文件。才会显示出来。 如果该路径下没有相应的文件&#xff0c;会显示/usr/share/httpd/noindex下的index.html文件。 如果/usr/share/httpd/noindex没有index.html文件&#xff0c;会…

使用Llama3/Qwen2等开源大模型,部署团队私有化Code Copilot和使用教程

目前市面上有不少基于大模型的 Code Copilot 产品&#xff0c;部分产品对于个人开发者来说可免费使用&#xff0c;比如阿里的通义灵码、百度的文心快码等。这些免费的产品均通过 API 的方式提供服务&#xff0c;因此调用时均必须联网、同时需要把代码、提示词等内容作为 API 的…

2024年亚太中文赛数学建模竞赛B题 洪水灾害的数据分析与预测详细思路解析

2024年亚太中文赛数学建模竞赛B题 洪水灾害的数据分析与预测详细思路解析 解题方法&#xff1a; 首先就是对数据进行数据的预处理包括缺失值和异常值处理&#xff0c;之后就是分析哪些指标与洪水的发生有着密切的关联&#xff0c;可以使用相关性分析&#xff08;建议使用斯皮尔…

WMS,OMS,TMS三者之间是什么关系?

WMS、OMS 和 TMS 是供应链管理中的三个重要系统&#xff0c;它们分别管理仓库、订单和运输的不同方面。 三者的功能&#xff1a; 1、WMS (Warehouse Management System) - 仓库管理系统&#xff1a; 1):主要负责仓库内部的操作和管理&#xff0c;包括库存管理、仓储空间优化、…

4K Tokkit Pro for Mac:轻松管理TikTok的利器

在TikTok的海洋中畅游&#xff0c;你是否想有一个得力助手来帮你高效管理你的账号&#xff1f;4K Tokkit Pro for Mac正是你的不二之选&#xff01; 这款专为Mac用户打造的TikTok管理工具&#xff0c;拥有简洁的界面和强大的功能&#xff0c;让你轻松下载、管理和分享喜欢的Ti…

【算法笔记自学】入门篇(2)——算法初步

4.1排序 自己写的题解 #include <stdio.h> #include <stdlib.h>void selectSort(int A[], int n) {for(int i 0; i < n - 1; i) { // 修正索引范围int k i;for(int j i 1; j < n; j) { // 修正索引范围if(A[j] < A[k]) {k j;}}if (k ! i) { // 仅在…

[SAP ABAP] 版本管理

版本管理是指软件开发过程中各种程序代码、配置文件以及说明文档等文件变更的管理 生成版本 版本管理 对比版本 点击上述版本管理即可进行版本对比操作 补充扩展 我们可以使用事务码SE10对传输请求进行创建、修改、删除、合并以及更改所有者等操作 使用事务码SCC1进行不同cl…