浅谈django框架集成swagger以及自定义参数问题
作者:长春小汪汪 发布时间:2022-01-09 20:25:10
介绍
我们在实际的开发工作中需要将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/
来源:https://blog.csdn.net/u011449784/article/details/103292801


猜你喜欢
- 四、XML应用分类 总的说来的XML的应用可分为四类: (1)应用于客户需要与不同的数据源进行交互时。数据可能来自不同的数据库,他们都有各自
- 相信许多小伙伴都玩过数字 * 游戏,就是指在一定数字范围(一般是整数,不包含边界)里,一个玩家选中一个数字当作 * ,其余玩家在这个范围猜数字,
- 项目功能地图编辑器:可以实现玩家自己定义每一关卡的样式和难易程度运行界面:实现了玩家的移动,跳跃,发射 * ,投掷 * ,以及敌人的AL(移动,
- 目录1. 字典基础知识字典的基本格式表示字典的键、值设置要求1)键的设置要求2)值的设置要求2. 字典元素增加1.利用赋值给字典增加元素2.
- 和C/C++、Java等语言一样,python在命名上也有一套约定俗成的规则,符合规范的命名可以让程序的可读性大大增加,从而使得代码的逻辑性
- 本文实例为大家分享了python字典操作实例的具体代码,供大家参考,具体内容如下#!/usr/bin/env python3# -*- co
- SQL1: --1、查看表空间的名称及大小 SELECT t.tablespace_name, round(SUM(bytes / (102
- 本文实例讲述了Python实现曲线拟合操作。分享给大家供大家参考,具体如下:这两天学习了用python来拟合曲线。一、环境配置本人比较比较懒
- python爬虫--爬取网易云音乐评论方1:使用selenium模块,简单粗暴。但是虽然方便但是缺点也是很明显,运行慢等等等。方
- 前言在日常开发中,我们经常需要判断目标元素是否在视窗之内或者和视窗的距离小于一个值(例如 100 px),从而实现一些常用的功能,例如:图片
- 这篇文章主要介绍了JavaScript switch语句使用方法简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 在SQL语句中如果定义字符串,则字符串必须使用“'”就是单引号进行声明,但是如果现在所操作的数据库本身含有“'”单引号,就会
- 我就废话不多说了,大家还是直接看代码吧~type Wait interface { // Register waits returns a
- 1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0
- 本文实例讲述了微信小程序开发之animation循环动画实现的让云朵飘效果。分享给大家供大家参考,具体如下:微信小程序提供了实现动画的api
- 本文实例讲述了MySQL 多表关联一对多查询实现取最新一条数据的方法。分享给大家供大家参考,具体如下:MySQL 多表关联一对多查询取最新的
- 对比Google Chrome、IE来说,在Windows环境下,Firefox 3.5的启动速度非常慢,据说是因为Firefox 3.5从
- 本书的作者Douglas Crockford是JavaScript开发社区最知名的权威,JavaScript的发明人Brendan Eich
- SQLyog是一款MySQL可视化工具,他可以将部分SQL操作通过图形化界面操作来完成,方便开发者更好的进行开发及数据库设计。在安装SQLy
- 前言在laravel项目开发中,经常使用到公共函数,那如何在laravel配置全局公共函数呢??下面话不多说了,来一起看看详细的介绍吧方法如