浅谈django框架集成swagger以及自定义参数问题


Posted in Python onJuly 07, 2020

介绍

我们在实际的开发工作中需要将django框架与swagger进行集成,用于生成API文档。网上也有一些关于django集成swagger的例子,但由于每个项目使用的依赖版本不一样,因此可能有些例子并不适合我们。我也是在实际集成过程中遇到了一些问题,例如如何自定义参数等问题,最终成功集成,并将结果分享给大家。

开发版本

我开发使用的依赖版本,我所使用的都是截止发稿日期为止最新的版本:

Django 2.2.7

django-rest-swagger 2.2.0

djangorestframework 3.10.3

修改settings.py

1、项目引入rest_framework_swagger依赖

INSTALLED_APPS = [
 ......
 'rest_framework_swagger',
 ......
]

2、设置DEFAULT_SCHEMA_CLASS,此处不设置后续会报错。

REST_FRAMEWORK = {
 ......
 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
 ......
}

在app下面创建schema_view.py

在此文件中,我们要继承coreapi中的SchemaGenerator类,并重写get_links方法,重写的目的就是实现我们自定义参数,并且能在页面上展示。此处直接复制过去使用即可。

from rest_framework.schemas import SchemaGenerator
from rest_framework.schemas.coreapi import LinkNode, insert_into
from rest_framework.renderers import *
from rest_framework_swagger import renderers
from rest_framework.response import Response
from rest_framework.decorators import APIView
from rest_framework.permissions import AllowAny,IsAuthenticated,IsAuthenticatedOrReadOnly
from django.http import JsonResponse

class MySchemaGenerator(SchemaGenerator):

 def get_links(self, request=None):
  links = LinkNode()

  paths = []
  view_endpoints = []
  for path, method, callback in self.endpoints:
   view = self.create_view(callback, method, request)
   path = self.coerce_path(path, method, view)
   paths.append(path)
   view_endpoints.append((path, method, view))

  # Only generate the path prefix for paths that will be included
  if not paths:
   return None
  prefix = self.determine_path_prefix(paths)

  for path, method, view in view_endpoints:
   if not self.has_view_permissions(path, method, view):
    continue
   link = view.schema.get_link(path, method, base_url=self.url)
   # 添加下面这一行方便在views编写过程中自定义参数.
   link._fields += self.get_core_fields(view)

   subpath = path[len(prefix):]
   keys = self.get_keys(subpath, method, view)

   # from rest_framework.schemas.generators import LinkNode, insert_into
   insert_into(links, keys, link)

  return links

 # 从类中取出我们自定义的参数, 交给swagger 以生成接口文档.
 def get_core_fields(self, view):
  return getattr(view, 'coreapi_fields', ())

class SwaggerSchemaView(APIView):
 _ignore_model_permissions = True
 exclude_from_schema = True

 #permission_classes = [AllowAny]
 # 此处涉及最终展示页面权限问题,如果不需要认证,则使用AllowAny,这里需要权限认证,因此使用IsAuthenticated
 permission_classes = [IsAuthenticated]
 # from rest_framework.renderers import *
 renderer_classes = [
  CoreJSONRenderer,
  renderers.OpenAPIRenderer,
  renderers.SwaggerUIRenderer
 ]

 def get(self, request):
  # 此处的titile和description属性是最终页面最上端展示的标题和描述
  generator = MySchemaGenerator(title='API说明文档',description='''接口测试、说明文档''')

  schema = generator.get_schema(request=request)

  # from rest_framework.response import Response
  return Response(schema)


def DocParam(name="default", location="query",required=True, description=None, type="string",
    *args, **kwargs):
 return coreapi.Field(name=name, location=location,
       required=required, description=description,
       type=type)

实际应用

在你的应用中定义一个接口,并发布。我这里使用一个测试接口进行验证。

注意

1、所有的接口必须采用calss的方式定义,因为要继承APIView。

2、class下方的注释post,是用来描述post方法的作用,会在页面上进行展示。

3、coreapi_fields 中定义的属性name是参数名称,location是传值方式,我这里一个采用query查询,一个采用header,因为我们进行身份认证,必须将token放在header中,如果你没有,去掉就好了,这里的参数根据你实际项目需要进行定义。

4、最后定义post方法,也可以是get、put等等,根据实际情况定义。

# 这里是之前在schema_view.py中定义好的通用方法,引入进来 
from app.schema_view import DocParam

'''
 测试
'''
class CustomView(APIView):
 '''
 post:
  测试测试测试
 '''
 coreapi_fields = (
  DocParam(name="id",location='query',description='测试接口'),
  DocParam(name="AUTHORIZATION", location='header', description='token'),
 )

 def post(self, request):
  print(request.query_params.get('id'));
  return JsonResponse({'message':'成功!'})

5、接收参数这块一定要注意,我定义了一个公用的方法,这里不做过多阐述,如实际过程遇到应用接口与swagger调用接口的传值问题,可参考如下代码。

def getparam(attr,request):
 obj = request.POST.get(attr);
 if obj is None:
  obj = request.query_params.get(attr);
 return obj;

修改url.py

针对上一步中定义的测试接口,我们做如下配置。

from django.contrib import admin
from rest_framework import routers
from django.conf.urls import url,include

# 下面是刚才自定义的schema
from app.schema_view import SwaggerSchemaView
# 自定义接口
from app.recommend import CustomView

router = routers.DefaultRouter()

urlpatterns = [
 # swagger接口文档路由
 url(r"^docs/$", SwaggerSchemaView.as_view()),
 url(r'^admin/', admin.site.urls),
 url(r'^', include(router.urls)),
 # drf登录
 url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))

 # 测试接口
 url(r'^test1', CustomView.as_view(), name='test1'),
]

效果展示

访问地址:http://localhost:8001/docs/

浅谈django框架集成swagger以及自定义参数问题

浅谈django框架集成swagger以及自定义参数问题

总结

以上这篇浅谈django框架集成swagger以及自定义参数问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用第三方库xlrd来读取Excel示例
Apr 05 Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 Python
PyGame贪吃蛇的实现代码示例
Nov 21 Python
Python lambda表达式用法实例分析
Dec 25 Python
浅谈python的深浅拷贝以及fromkeys的用法
Mar 08 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
Jan 14 Python
Django 再谈一谈json序列化
Mar 16 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 Python
Python3爬虫发送请求的知识点实例
Jul 30 Python
学会迭代器设计模式,帮你大幅提升python性能
Jan 03 Python
Django REST Swagger实现指定api参数
Jul 07 #Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 #Python
python db类用法说明
Jul 07 #Python
python文件编写好后如何实践
Jul 07 #Python
python 删除excel表格重复行,数据预处理操作
Jul 06 #Python
pandas.DataFrame.drop_duplicates 用法介绍
Jul 06 #Python
TensorFlow Autodiff自动微分详解
Jul 06 #Python
You might like
php中session定期自动清理的方法
2015/11/12 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
python回调函数的使用方法
2014/01/23 Python
Python中使用glob和rmtree删除目录子目录及所有文件的例子
2014/11/21 Python
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
CentOS6.5设置Django开发环境
2016/10/13 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
2018/07/27 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
药物学专业学生的自我评价
2013/10/27 职场文书
记者岗位职责
2014/01/06 职场文书
工程承诺书怎么写
2014/05/24 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
学校捐书倡议书
2015/04/27 职场文书
Spring中的@Transactional的工作原理
2022/06/05 Java/Android
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技