首先安装swagger所用的包

pip install drf-yasg

  

  然后再settings.py 中注册app

  

  

  

  接口采用的token认证,在settings.py配置认证方式

    

SWAGGER_SETTINGS = {
'USE_SESSION_AUTH': False,
'SECURITY_DEFINITIONS': {
'身份验证': {
'type': 'apiKey',
'in': 'header',
'name': 'Authorization'
}
},
}

  

  配好后打开的认证是这样的

  

  

  在urls.py中配置路由

    

from django.contrib import admin
from django.urls import path, include # 使用 drf_yasg API文档生成器 视图和openapi
from django.views.static import serve
from drf_yasg.views import get_schema_view
from drf_yasg import openapi # 导入权限控制模块
from rest_framework import permissions # 文档视图
schema_view = get_schema_view(
# API 信息
openapi.Info(
title='接口文档', # API文档标题
default_version='V1', # 版本信息
description='接口文档', # 描述内容
# terms_of_service='https://qaq.com', # 开发团队地址
# contact=openapi.Contact(email='https://qaq.@qq.com',url='https://qaq.com'), # 联系人信息:邮件、网址
# license=openapi.License(name='qaq License'), # 证书
),
public=True, # 是否公开
# permission_classes=(permissions.AllowAny,) # 设置用户权限 ) urlpatterns = [
path('admin/', admin.site.urls), path('userManage/', include('userManage.urls')),
path('ani/', include('ani.urls')), 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'), # 文档模式
]

  

  配置好以后打开  http://127.0.0.1:8000/swagger/即可访问到接口文档页面

  

  打开查看后发现,请求的参数缺少了,返回的参数和接口实际返回的参数不一样,因为我的视图继承APIView做了一些自定义的请求参数和返回参数。

  所以需要自定义swagger

  util.py文件,因为自动生成的采用序列化 query_serializer参数就会将一些外键的source字段也加到参数里面,所以重新去获取序列器的字段。再定义一个

  固定格式的基类

  

from rest_framework import serializers
from drf_yasg import openapi
from rest_framework.relations import PrimaryKeyRelatedField
from rest_framework.fields import ChoiceField def serializer_to_swagger(ser_model, get_req=False):
'''
将序列化字段转成openapi的形式
'''
if ser_model is None and get_req is True:
return {}, []
elif ser_model is None and get_req is False:
return {}
dit = {}
serializer_field_mapping = {
ChoiceField: openapi.TYPE_INTEGER,
PrimaryKeyRelatedField: openapi.TYPE_INTEGER,
serializers.IntegerField: openapi.TYPE_INTEGER,
serializers.BooleanField: openapi.TYPE_BOOLEAN,
serializers.CharField: openapi.TYPE_STRING,
serializers.DateField: openapi.TYPE_STRING,
serializers.DateTimeField: openapi.TYPE_STRING,
serializers.DecimalField: openapi.TYPE_NUMBER,
serializers.DurationField: openapi.TYPE_STRING,
serializers.EmailField: openapi.TYPE_STRING,
serializers.ModelField: openapi.TYPE_OBJECT,
serializers.FileField: openapi.TYPE_STRING,
serializers.FloatField: openapi.TYPE_NUMBER,
serializers.ImageField: openapi.TYPE_STRING,
serializers.SlugField: openapi.TYPE_STRING,
serializers.TimeField: openapi.TYPE_STRING,
serializers.URLField: openapi.TYPE_STRING,
serializers.UUIDField: openapi.TYPE_STRING,
serializers.IPAddressField: openapi.TYPE_STRING,
serializers.FilePathField: openapi.TYPE_STRING,
}
fields = ser_model().get_fields()
if get_req:
required = []
for k, v in fields.items():
description = getattr(v, 'label', '')
if isinstance(v, serializers.SerializerMethodField) or getattr(v, 'source'):
continue
elif isinstance(v, ChoiceField):
description += str(dict(getattr(v, 'choices', {})))
if getattr(v, 'required', True) is not False:
required.append(k)
typ = serializer_field_mapping.get(type(v), openapi.TYPE_STRING)
dit[k] = openapi.Schema(description=description, type=typ)
return dit, required
else:
for k, v in fields.items():
description = getattr(v, 'label', '')
if isinstance(v, ChoiceField):
description += str(dict(getattr(v, 'choices', {})))
elif isinstance(v, serializers.SerializerMethodField):
continue
typ = serializer_field_mapping.get(type(v), openapi.TYPE_STRING)
dit[k] = openapi.Schema(description=description, type=typ) return dit class ViewSwagger(object):
"""
openapi视图类
重写请求参数和返回参数,调用对应的类方法即可
""" get_operation = '获取数据'
get_req_params = []
get_req_body = None
get_res_data = None
get_res_examples = {'json': {}}
get_res_description = ' '
get_res_code = 200 post_operation = '新增数据'
post_req_params = []
post_req_body = None
post_res_data = None
post_res_examples = {'json': {}}
post_res_description = ' '
post_res_code = 200 put_operation = '修改数据'
put_req_params = []
put_req_body = None
put_res_data = None
put_res_examples = {'json': {}}
put_res_description = ' '
put_res_code = 200 delete_operation = '删除数据'
delete_req_params = []
delete_req_body = None
delete_res_data = None
delete_res_examples = {'json': {}}
delete_res_description = ' '
delete_res_code = 200 @classmethod
def req_serialize_schema(cls, serializer):
return serializer_to_swagger(serializer, get_req=True) @classmethod
def res_serialize_schema(cls, serializer):
return serializer_to_swagger(serializer, get_req=False) @classmethod
def get(cls):
ret = {
'manual_parameters': cls.get_req_params,
'request_body': cls.get_req_body,
'operation_summary': cls.get_operation,
'responses': {
cls.get_res_code: openapi.Response(description=cls.get_res_description, schema=cls.get_res_data,
examples=cls.get_res_examples)}
}
return ret @classmethod
def post(cls):
ret = {
'manual_parameters': cls.post_req_params,
'request_body': cls.post_req_body,
'operation_summary': cls.post_operation,
'responses': {
cls.post_res_code: openapi.Response(description=cls.post_res_description, schema=cls.post_res_data,
examples=cls.post_res_examples)}
}
return ret @classmethod
def put(cls):
ret = {
'manual_parameters': cls.put_req_params,
'request_body': cls.put_req_body,
'operation_summary': cls.put_operation,
'responses': {
cls.put_res_code: openapi.Response(description=cls.put_res_description, schema=cls.put_res_data,
examples=cls.put_res_examples)}
}
return ret @classmethod
def delete(cls):
ret = {
'manual_parameters': cls.delete_req_params,
'request_body': cls.delete_req_body,
'operation_summary': cls.delete_operation,
'responses': {
cls.delete_res_code: openapi.Response(description=cls.delete_res_description,
schema=cls.delete_res_data,
examples=cls.delete_res_examples)}
}
return ret

  下面只要在视图中单独定义对应的字段即可,gender.py 如下

  

import copy

from django.utils.decorators import method_decorator

from ani import models
from ani.serializer import GenderSerializer
from utils.decorators import request_decrypt, auth_token
from utils.myView import MyPagination, MyView, MixinGetList, MixinPostCreateModel, MixinPutUpdateModel, \
MixinDeleteDestroyModel from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from utils.util import ViewSwagger class APISwagger(ViewSwagger):
serializer = GenderSerializer
res_ser_schema = ViewSwagger.res_serialize_schema(serializer)
req_ser_schema, req_ser_required_fields = ViewSwagger.req_serialize_schema(serializer)
get_operation = '获取数据'
get_req_params = [
openapi.Parameter(name='name__icontains', in_=openapi.IN_QUERY, description='过滤包含该字段', type=openapi.TYPE_STRING,
required=False),
]
get_req_body = None
get_res_data = openapi.Schema(type=openapi.TYPE_OBJECT, properties={
'data': openapi.Schema(description='', type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_OBJECT, properties={
**res_ser_schema
})),
'total': openapi.Schema(description='总数', type=openapi.TYPE_INTEGER),
})
get_res_examples = {'json': {}}
get_res_description = 'get返回'
get_res_code = 200 post_schema = copy.copy(req_ser_schema)
del post_schema['id']
post_operation = '新增数据'
post_req_params = []
post_req_body = openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
**post_schema
},
required=req_ser_required_fields
)
post_res_data = openapi.Schema(type=openapi.TYPE_OBJECT, properties={
**res_ser_schema
})
post_res_examples = {'json': {}}
post_res_description = ' '
post_res_code = 200 put_fields = req_ser_required_fields
put_fields.append('id')
put_operation = '新增数据'
put_req_params = []
put_req_body = openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
**req_ser_schema
},
required=put_fields
)
put_res_data = openapi.Schema(type=openapi.TYPE_OBJECT, properties={
**res_ser_schema
})
put_res_examples = {'json': {}}
put_res_description = ' '
put_res_code = 200 @method_decorator([swagger_auto_schema(**APISwagger.delete())], name='delete')
@method_decorator([swagger_auto_schema(**APISwagger.put())], name='put')
@method_decorator([swagger_auto_schema(**APISwagger.post())], name='post')
@method_decorator([swagger_auto_schema(**APISwagger.get())], name='get')
# @method_decorator(auth_token, name='get')
class GenderView(MyView, MixinGetList, MixinPostCreateModel, MixinPutUpdateModel, MixinDeleteDestroyModel):
"""
get:
查询
post:
新增
put:
修改
delete:
删除 """
queryset = models.Gender.objects.all()
serializer_class = GenderSerializer
all_serializer_class = GenderSerializer
filter_class = ['name__icontains']
pagination_class = MyPagination
lookup_field = 'id'
ordeing_field = ('-id',)

  

  打开的接口文档变成

  

  try it out 调用接口,得到一样的数据

  

  

  注意:如果是post请求提交表单数据的时候,那么这个视图只能解析  parser_classes = [MultiPartParser],自定义的字段和get请求差不多,只需要将 _in=openapi.IN_FORM  即可

  项目文件结构

  

    

  

django配置swagger自动生成接口文档以及自定义参数设置的更多相关文章

  1. [Django REST framework - 自动生成接口文档、分页]

    [Django REST framework - 自动生成接口文档.分页] 自动生成接口文档 # 后端人员写好接口,编写接口文档,给前端人员看,前端人员依照接口文档开发 # 公司里主流 -后端,使用w ...

  2. .net core 使用swagger自动生成接口文档

     前言 swagger是一个api文档自动生动工具,还集成了在线调试. 可以为项目自动生成接口文档, 非常的方便快捷 Swashbuckle.AspNetCore 是一个开源项目,用于生成 ASP.N ...

  3. Asp.Net Core 轻松学-利用 Swagger 自动生成接口文档

    前言     目前市场上主流的开发模式,几乎清一色的前后端分离方式,作为服务端开发人员,我们有义务提供给各个客户端良好的开发文档,以方便对接,减少沟通时间,提高开发效率:对于开发人员来说,编写接口文档 ...

  4. Asp.Net Core 轻松学系列-5利用 Swagger 自动生成接口文档

    目录 前言 结语 源码下载 前言     目前市场上主流的开发模式,几乎清一色的前后端分离方式,作为服务端开发人员,我们有义务提供给各个客户端良好的开发文档,以方便对接,减少沟通时间,提高开发效率:对 ...

  5. springboot结合swagger自动生成接口文档

    前后台分离的开发渐渐已成趋势.那么前后端的沟通就成了问题,包括移动端,web端.如果有一个东西在我们写完代码的时候,自动将接口的所有注释,调用文档提供出来,是不是一件很美好的事情.那就是使用swagg ...

  6. Swagger自动生成接口文档

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  7. IDEA插件Apifox,一键自动生成接口文档!

    有关Apifox软件之前写过一篇文章: 接口测试神器Apifox,亲测好用! 如何一键自动生成数据库文档之前也写过一篇文章: 数据库界的Swagger:一键生成数据库文档! 一.Apifox插件的优势 ...

  8. WebApi使用swagger ui自动生成接口文档

    之前就写到.最近正在使用webapi.这里介绍一个实用的东西swageer ui现在开发都是前后端分开.我们这里是给前端提供api.有时候对于一个api的描述,并不想专门写一份文档.很浪费时间.swa ...

  9. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)

    一.Django中的缓存: 前戏: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一 ...

  10. Django rest_framework 自动生成接口文档

    自动生成接口文档 REST framework可以自动帮助我们生成接口文档. 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的视图. 1. 安装依赖 REST fram ...

随机推荐

  1. Grafana系列-统一展示-8-ElasticSearch日志快速搜索仪表板

    系列文章 Grafana 系列文章 概述 我们是基于这篇文章: Grafana 系列文章(十二):如何使用 Loki 创建一个用于搜索日志的 Grafana 仪表板, 创建一个类似的, 但是基于 El ...

  2. vue全家桶进阶之路29:Element Plus

    Element Plus是一个用于Vue.js的UI组件库,为开发人员提供了一组可重用和可定制化的组件,用于构建现代Web应用程序.它是流行的Element UI库的扩展,重点是提高性能和可访问性. ...

  3. 代码随想录算法训练营Day5 数组、链表复习

    数组部分 数组最重要的思维方式是双指针的使用. 快慢指针 在进行元素移除和元素操作时会使用两个for循环嵌套,此时时间复杂度为O(n²).在for循环中通过双指针(快慢指针)的使用可以使时间复杂度将为 ...

  4. python 学习 ---函数(带参数)

    函数式编程最重要的是增强代码的重用性和可读性 1 def 函数名(参数): 2 3 ... 4 函数体 5 ... 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函 ...

  5. OCR -- 文本识别 -- 理论篇

    文本识别的应用场景很多,有文档识别.路标识别.车牌识别.工业编号识别等等,根据实际场景可以把文本识别任务分为两个大类:规则文本识别和不规则文本识别. 规则文本识别:主要指印刷字体.扫描文本等,认为文本 ...

  6. 在Istio中,到底怎么获取 Envoy 访问日志?

    Envoy 访问日志记录了通过 Envoy 进行请求 / 响应交互的相关记录,可以方便地了解具体通信过程和调试定位问题. 环境准备 部署 httpbin 服务: kubectl apply -f sa ...

  7. Nginx+php关联

    nginx配置php选项,解除对IIS.Apache的php环境依赖 php.ini配置 取消extension_dir注释 取消cgi.fix_pathinfo注释 nginx.conf配置 取消 ...

  8. 一个C#跨平台的机器视觉和机器学习的开源库

    大家都知道OpenCV是一个跨平台的机器视觉和机器学习的开源库,可以运行在Linux.Windows.Android和Mac OS操作系统上,由C++开发. 今天给大家介绍一个用C#对OpenCV封装 ...

  9. 使用部分写时复制提升Lakehouse的 ACID Upserts性能

    使用部分写时复制提升Lakehouse的 ACID Upserts性能 译自:Fast Copy-On-Write within Apache Parquet for Data Lakehouse A ...

  10. java开发的配置文件配置到数据库(配置到配置文件里面个人感觉修改较麻烦,故配置到数据库)

    配置文件的创建表sql CREATE TABLE `checkwork_tab_properties` ( `id` varchar(50) NOT NULL COMMENT '主键id', `typ ...