優(yōu)質(zhì)文章,第一時間送達!
近期推文:
Python利用Django 構(gòu)建Rest Api: 快速入門教程
Python 3+Django 3 結(jié)合Vue.js框架構(gòu)建前后端分離Web開發(fā)平臺實戰(zhàn)
當接口開發(fā)完成,緊接著需要編寫接口文檔。傳統(tǒng)的接口文檔通常都是使用Word或者一些接口文檔管理平臺進行編寫,但此類接口文檔維護更新比較麻煩,每次接口有變更,需要手動修改接口文檔。在實際的工作中,經(jīng)常會遇到:“前端抱怨后端給的接口文檔與實際情況不一致。后端又覺得編寫及維護接口文檔會耗費不少精力,經(jīng)常來不及更新”。為了解決這個問題,業(yè)界推出了一個Swagger框架來管理接口文檔,實現(xiàn)接口文檔的自動更新。
采用Swagger框架來管理接口文檔,常用于在微服務(wù)架構(gòu)設(shè)計或者Java的后端服務(wù)工程中。這也造成了很多讀者誤認為Swagger只是Java語言下的一個框架,其實并不是的,Swagger除了能應用在Java語言的工程中,也同時適用于在其它語言下,比如Python。接下來,在本篇文章,介紹的就是基于Python3+Django3下,如何接入Swagger框架,并且實現(xiàn)Swagger接口文檔的自動生成。
Swagger:它是一款RESTFUL接口的文檔在線自動生成+功能測試并集規(guī)范于一體的工具框架,可用于生成、描述、調(diào)用和可視化RESTful風格的Web服務(wù)??傮w目標是使客戶端和文件系統(tǒng)源代碼作為服務(wù)器以同樣的速度來更新。當接口有變動時,對應的接口文檔也會自動更新生成。
例如:接口測試站點(http://httpbin.org/#/),也是利用Swagger來生成接口文檔的。
Swagger優(yōu)勢:
1)Swagger可生成一個具有互動性的API控制臺,開發(fā)者可快速學習和嘗試API
2)Swagger支持不同客戶端SDK代碼,用于不同平臺上(Java、Python、...)的實現(xiàn)
3)Swagger可在不同的平臺上從代碼注釋中自動生成
4)Swagger社區(qū)活躍,里面有許多強悍的貢獻者
1、在開始之前,我們先創(chuàng)建一個項目操作目錄和隔離環(huán)境,具體操作如下:
# 創(chuàng)建項目目錄
mkdir django_swagger
cd django_swagger
# 創(chuàng)建隔離開發(fā)環(huán)境
python3 -m venv env
source env/bin/activate
2、安裝django相關(guān)庫
(env) ? pip install django
(env) ? pip install djangorestframework
3、創(chuàng)建django項目和app
# 創(chuàng)建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
到此,我們已經(jīng)準備好了django基礎(chǔ)環(huán)境和生成好了項目結(jié)構(gòu)。
網(wǎng)上很多資料在介紹Django接入Swagger方法時,都是基于django-rest-swagger庫進行講解的,都殊不知,從2019年6月份開始,官方已經(jīng)廢棄了該庫,在django 3.0中已經(jīng)不支持該庫了,取而代之的是全新的第三方drf-yasg庫。
GitHub地址:
https://github.com/marcgibbons/django-rest-swagger
所以本文也是基于drf-yasg庫來實現(xiàn)在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="請輸入接口負責人名字")
# 創(chuàng)建時間
create_time = models.DateTimeField(auto_now_add=True, verbose_name="創(chuàng)建時間")
# 修改時間
update_time = models.DateTimeField(auto_now=True, blank=True, null=True, verbose_name="修改時間")
class Meta:
db_table = 'api_info'
# 設(shè)置表名,默認表名是:應用名稱_模型類名
# 帶有應用名的表名太長了
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文件,代碼內(nèi)容如下:
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):
"""
更新接口內(nèi)容
"""
queryset = models.APIInfo.objects.all()
serializer_class = serializers.APISerializer
class APIInfoViewSet(viewsets.ModelViewSet):
"""
retrieve:
返回一組(查)
list:
返回所有組(查)
create:
創(chuàng)建新組(增)
delete:
刪除現(xiàn)有的一組(刪)
partial_update:
更新現(xiàn)有組中的一個或多個字段(改:部分更改)
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'),
]
1、上述一切配置完成后,開始進行數(shù)據(jù)庫遷移、同步。
# 生成遷文件、執(zhí)行同步
python manage.py makemigrations
python manage.py migrate
2、創(chuàng)建后臺管理員用戶
python manage.py createsuperuser
3、運行服務(wù)
python manage.py runserver
1、服務(wù)運行起來后,默認端口為8000,瀏覽器訪問http://127.0.0.1:8000/redoc/,可查看redoc ui,效果如下所示。
2、點擊左側(cè)的api,展開各接口詳細如下所示。
PS: ReDoc 是另一個 Swagger UI 工具。
3、繼續(xù)訪問http://127.0.0.1:8000/swagger,即可看到日常我們熟悉的Swagger接口文檔界面了。
4、Swagger除了可以即時生成接口文檔以外,還可以用于在線做一些接口功能測試,如下所示。
5、在Swagger中還可以查看到在model定義的各字段類型及參數(shù)說明。
到此,我們Django3接入Swagger已經(jīng)完成了,更多swagger的功能使用請讀者自行嘗試。