Django自动生成Swagger接口文档

Django自动生成Swagger接口文档

1. 前言

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

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

2. Swagger介绍

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

image.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库。

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模型(为了方便演示)

ffrom 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、修改api/urls.py文件,进行路由配置。

from django.conf.urls import url
from . import views

urlpatterns = [
    url('', views.APIList.as_view()),
    url('<int:pk>/', views.APIDetail.as_view()),
]

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

from django.conf.urls import url
from django.contrib import admin
from django.conf import settings
from django.conf.urls import 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="#",
        contact=openapi.Contact(email="测试"),
        license=openapi.License(name="BSD License"),
    ),
    public=True,
    permission_classes=(permissions.AllowAny,),
)

urlpatterns = [
    url('admin/', admin.site.urls),

    # 配置django-rest-framwork API路由
    url('api/', include('api.urls')),
    url('api-auth/', include('rest_framework.urls', namespace='rest_framework')),

    # 配置drf-yasg路由
    url('^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
    url('swagger', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
    url('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,效果如下所示。

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

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

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

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


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

到此,我们Django3接入Swagger已经完成了

学习来源
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • Django是一款高级的Python Web框架,可以帮助开发者快速创建web应用。我们这里整理了30款Djang...
    汪菲宇阅读 3,595评论 0 37
  • 简介 Swagger是什么?在解答这个问题之前,我们先来看看开发Restful API过程中会遇到什么问题。我们如...
    geekpy阅读 7,999评论 0 5
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,984评论 1 3
  • Instance Run是Android stadio 2.0新增的运行方式,目标是减少构建和部署app的时间。 ...
    ztzt123阅读 1,476评论 0 0
  • 时隔2年,吴京带着《战狼2》再次热血归来,燃爆各大影院。在上映一周的时间里票房已经突破25亿,并且上涨势头依旧猛...
    颜落惜阅读 407评论 0 0