电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Django REST Swagger實現指定api參數

瀏覽:168日期:2024-09-28 09:27:31

為什么要指定swagger的api參數

api的參數有多種類型:

query 參數,如 /users?role=admin

path 參數,如 /users/{id}

header 參數,如 X-MyHeader: Value

body 參數,描述POST,PUT,PATCH請求的body

form 參數,描述 Content-Type of application/x-www-form-urlencoded 和 multipart/form-data 的請求報文body的參數

swagger指定api參數就可以在文檔相應的api條目中顯示出api的描述、正常輸出、異常輸出、參數的名稱、描述、是否必填、值類型、參數類型對不同的參數類型有不同的顯示效果。swagger是可交互的api文檔,可以直接填入文檔顯示的參數的值并發送請求,返回的結果就會在文檔中顯示。

Django REST Swagger實現指定api參數

難點

對 Django REST Swagger < 2 的版本,要指定swagger的api參數非常容易,只要將相關說明以特定格式和yaml格式寫在相應api的視圖函數的文檔字符串(DocStrings)里,swagger就會自動渲染到文檔中。比如這樣的格式:

def cancel(self, request, id): ''' desc: 取消任務,進行中的參與者得到報酬 ret: msg err: 404頁面/msg input: - name: id desc: 任務id type: string required: true location: path '''

但是在2.0版本之后,Django REST Swagger廢棄了對yaml文檔字符串的支持,不會渲染出任何內容。

一種解決方案

在Django REST framework基于類的api視圖中定義filter_class過濾出模型(models)的特定字段,swagger會根據這些字段來渲染。

from django_filters.rest_framework.filterset import FilterSetclass ProductFilter(FilterSet): class Meta(object): models = models.Product fields = ( ’name’, ’category’, ’id’, )class PurchasedProductsList(generics.ListAPIView): ''' Return a list of all the products that the authenticated user has ever purchased, with optional filtering. ''' model = Product serializer_class = ProductSerializer filter_class = ProductFilter def get_queryset(self): user = self.request.user return user.purchase_set.all()

這個解決方法只解決了一半問題,只能用在面向模型的api,只能過濾模型的一些字段,而且api參數名與模型字段名不一致時還要額外處理。

啟發

查閱Django REST Swagger的文檔,Advanced Usage提到,基于類的文檔api視圖是這樣的:

from rest_framework.response import Responsefrom rest_framework.schemas import SchemaGeneratorfrom rest_framework.views import APIViewfrom rest_framework_swagger import renderersclass SwaggerSchemaView(APIView): permission_classes = [AllowAny] renderer_classes = [ renderers.OpenAPIRenderer, renderers.SwaggerUIRenderer ] def get(self, request): generator = SchemaGenerator() schema = generator.get_schema(request=request) return Response(schema)

說明文檔是根據schema變量來渲染的,所以可以通過重載schema變量,利用yaml包解析出api視圖函數的文檔字符串中的參數定義賦值給schema變量。

更好的解決方法

創建schema_view.py:

from django.utils.six.moves.urllib import parse as urlparsefrom rest_framework.schemas import AutoSchemaimport yamlimport coreapifrom rest_framework_swagger.views import get_swagger_viewclass CustomSchema(AutoSchema): def get_link(self, path, method, base_url): view = self.view method_name = getattr(view, ’action’, method.lower()) method_docstring = getattr(view, method_name, None).__doc__ _method_desc = ’’ fields = self.get_path_fields(path, method) try: a = method_docstring.split(’---’) except: fields += self.get_serializer_fields(path, method) else: yaml_doc = None if method_docstring: try: yaml_doc = yaml.load(a[1]) except: yaml_doc = None # Extract schema information from yaml if yaml_doc and type(yaml_doc) != str: _desc = yaml_doc.get(’desc’, ’’) _ret = yaml_doc.get(’ret’, ’’) _err = yaml_doc.get(’err’, ’’) _method_desc = _desc + ’n<br/>’ + ’return: ’ + _ret + ’<br/>’ + ’error: ’ + _err params = yaml_doc.get(’input’, []) for i in params: _name = i.get(’name’) _desc = i.get(’desc’) _required = i.get(’required’, False) _type = i.get(’type’, ’string’) _location = i.get(’location’, ’form’) field = coreapi.Field( name=_name, location=_location, required=_required, description=_desc, type=_type ) fields.append(field) else: _method_desc = a[0] fields += self.get_serializer_fields(path, method) fields += self.get_pagination_fields(path, method) fields += self.get_filter_fields(path, method) manual_fields = self.get_manual_fields(path, method) fields = self.update_fields(fields, manual_fields) if fields and any([field.location in (’form’, ’body’) for field in fields]): encoding = self.get_encoding(path, method) else: encoding = None if base_url and path.startswith(’/’): path = path[1:] return coreapi.Link( url=urlparse.urljoin(base_url, path), action=method.lower(), encoding=encoding, fields=fields, description=_method_desc )schema_view = get_swagger_view(title=’API’)

urls.py中指向schema_view:

from .schema_view import schema_viewurlpatterns = [ url(r’^v1/api/’, include([ url(r’^doc/’, schema_view), ])),

然后在需要指定api參數的視圖類(如APIView或ModelViewSet)中重載schema:

schema = CustomSchema()

以上這篇Django REST Swagger實現指定api參數就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Django
相關文章:
主站蜘蛛池模板: 金刚网,金刚网窗纱,不锈钢网,金刚网厂家- 河北萨邦丝网制品有限公司 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 北京中创汇安科贸有限公司 | 西安微信朋友圈广告投放_微信朋友圈推广_西安度娘网络科技有限公司 | 电解抛光加工_不锈钢电解抛光_常州安谱金属制品有限公司 | 「阿尔法设计官网」工业设计_产品设计_产品外观设计 深圳工业设计公司 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 上海心叶港澳台联考一对一培训_上海心叶港澳台联考,港澳台联考一对一升学指导 | pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 深圳标识制作公司-标识标牌厂家-深圳广告标识制作-玟璟广告-深圳市玟璟广告有限公司 | 杭州门窗厂家_阳光房_包阳台安装电话-杭州窗猫铝合金门窗 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | 天津仓储物流-天津电商云仓-天津云仓一件代发-博程云仓官网 | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | 东莞市超赞电子科技有限公司 全系列直插/贴片铝电解电容,电解电容,电容器 | 定做大型恒温循环水浴槽-工业用不锈钢恒温水箱-大容量低温恒温水槽-常州精达仪器 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 法兰螺母 - 不锈钢螺母制造厂家 - 万千紧固件--螺母街 | 标准品网_标准品信息网_【中检计量】 | 数码管_LED贴片灯_LED数码管厂家-无锡市冠卓电子科技有限公司 | 回收二手冲床_金丰旧冲床回收_协易冲床回收 - 大鑫机械设备 | 创客匠人-让IP变现不走弯路 | 煤粉取样器-射油器-便携式等速飞灰取样器-连灵动 | 上海办公室装修,办公楼装修设计,办公空间设计,企业展厅设计_写艺装饰公司 | 爆炸冲击传感器-无线遥测传感器-航天星百科 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 天助网 - 中小企业全网推广平台_生态整合营销知名服务商_天助网采购优选 | 丙烷/液氧/液氮气化器,丙烷/液氧/液氮汽化器-无锡舍勒能源科技有限公司 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 杭州可当科技有限公司—流量卡_随身WiFi_AI摄像头一站式解决方案 | 便携式表面粗糙度仪-彩屏硬度计-分体式粗糙度仪-北京凯达科仪科技有限公司 | 真空乳化机-灌装封尾机-首页-温州精灌| 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 热处理炉-退火炉-回火炉设备厂家-丹阳市电炉厂有限公司 | 中药超微粉碎机(中药细胞级微粉碎)-百科 |