django drf_yasg 非restful风格的api怎么在swagger上展示?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django drf_yasg 非restful风格的api怎么在swagger上展示?相关的知识,希望对你有一定的参考价值。
使用SwaggerSwagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。
在web api 使用swagger可以说非常简单,不需要编写任何代码,完全依赖于插件。具体步骤如下:
1.新建一个web api项目
2.使用nuget添加Swashbuckle包
3.完成
没错,就是这么简单!运行项目,转到地址 http://localhost:57700/swagger/ui/index 会看到如下页面,这是默认添加的两个apicontroller:
这个时候接口还没有具体的描述信息等,例如我们给ValuesController.Get添加注释描述,在页面上还是没有显示出来。需要按照如下步骤实现:
1. 在app_start 下 SwaggerConfig 大100行的位置找到 //c.IncludeXmlComments(GetXmlCommentsPath()); 如下注释,改为:c.IncludeXmlComments(GetXmlCommentsPath(thisAssembly.GetName().Name)); (注意去掉注释了)
2. 在SwaggerConfig添加一个方法代码:
1
2
3
4
protected static string GetXmlCommentsPath(string name)
return string.Format(@"0\bin\1.XML", AppDomain.CurrentDomain.BaseDirectory, name);
3. 修改项目生成,在bin下对应的xml文件可以看到具体的描述文档,如下:
重新生成项目,就要可以看到完整的接口描述了。例如我们心中一个TestController如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/// <summary>
/// 测试控制器
/// </summary>
public class TestController : ApiController
/// <summary>
/// 测试Get方法
/// </summary>
/// <remarks>测试Get方法</remarks>
/// <returns></returns>
[HttpGet]
public string Get()
return "Get";
/// <summary>
/// 测试Post方法
/// </summary>
/// <param name="name">姓名</param>
/// <param name="age">年龄</param>
/// <remarks>测试Post方法</remarks>
/// <returns></returns>
[HttpPost]
public string Post(string name, int age)
return name + age.ToString();
生成的页面如下,可以看到接口的描述,点击Try it out 即可调用:
三、非依赖代码
上面的方式依赖于Swashbuckle包,它已经包含了Swagger-UI组件。我们的代码需要引入这个包,实际上也可以不需要在项目中引入,单独部署Swagger,包括Swagger-Ui(api展示) 和 Swagger-Editor(在线编辑器),它需要依赖nodejs环境,所以需要先按照nodejs。部署其实也很简单,例如这是我部署的结果:
swagger-editor:
swagger-ui:
编辑后只需要将文件保存为json文件,然后拷贝到指定的目录即可。这个部署也非常简单,具体可以参照:
参考技术A PS: 个人深感python开发者社区氛围比安卓/ios/java差多了。不过,这也许是个机会~
前提: 本人开发环境是mac10.14.4,Python3.7.2
django-rest-swagger vs drf-yasg
百度google各种查询帖子,python中生成自动化API文档绝大部分用的都是django-rest-swagger库,然而此库作者表示在2019-06-04已停止更新,而且此库需要的第三方版本库是:
Django 1.8+
Django REST framework 3.5.1+
Python 2.7, 3.5, 3.6
换句话说,django-rest-swagger并不支持Python3.7的环境,所以本人选择了drf-yasg库,它需要的第三方版本库是:
Django Rest Framework: 3.8, 3.9
Django: 1.11, 2.1, 2.2
Python: 2.7, 3.5, 3.6, 3.7
drf-yasg快速上手
安装
pip install -U drf-yasg
1
1
在settings.py声明app,并将debug设置为true
INSTALLED_APPS = [
...
'drf_yasg',
...
]
DEBUG = True
1
2
3
4
5
6
7
1
2
3
4
5
6
7
在根url.py添加scheme_view
from rest_framework import permissions
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
schema_view = get_schema_view(
openapi.Info(
title="API文档",
default_version='v1.0.0',
contact=openapi.Contact(name='联系开发者', email="your email"),
),
permission_classes=(permissions.AllowAny,),
)
urlpatterns = [
...
url('swagger', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
踩坑
1. 找不到drf目录下的静态文件
解决方案:测试环境settings.py中的DEBUG设置为true(方便生成api文档), 生产环境设置为False。在python环境中,如果使用drf库生成API文档,需要将DEBUG设置为true,否则找不到静态文件。
以上是关于django drf_yasg 非restful风格的api怎么在swagger上展示?的主要内容,如果未能解决你的问题,请参考以下文章
Django-rest-framework-jwt 不会为非员工帐户返回 JWToken(django 管理员错误?)
与 Django Rest Framework 的非用户连接的自定义身份验证
在 Django Rest 框架中获取图像字段绝对路径 - 非请求流
无法在 Django Rest Framework 序列化程序的验证数据中获取非模型字段