成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

Django REST Swagger實現指定api參數

瀏覽:237日期: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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
av不卡一区二区三区| 麻豆国产欧美日韩综合精品二区| 久久久亚洲精品石原莉奈| 综合久久久久久久| 久久99精品视频| 亚洲国产精品第一区二区| 欧美精品久久99久久在免费线 | 精品国产乱码久久久久久影片| 亚洲精品ww久久久久久p站| 成人自拍视频在线| 蜜桃av久久久亚洲精品| 久久久影院官网| 欧美aaaaa成人免费观看视频| 欧美日韩一区二区高清| 日韩欧美国产小视频| 图片区小说区区亚洲影院| 色综合中文字幕| 欧美日韩黄色一区二区| 亚洲一区二三区| 国模精品一区二区三区| 日韩欧美精品三级| 日日骚欧美日韩| 99在线观看免费视频精品观看| www精品美女久久久tv| 看电视剧不卡顿的网站| 翔田千里一区二区| 国产精品久久久久三级| 国产精品中文字幕一区二区三区| 久久午夜精品| 亚洲精品福利视频网站| 欧美精品激情| 精品久久一区二区| 韩国欧美一区二区| 午夜亚洲福利| 欧美精品一区二| 国产精品亚洲一区二区三区妖精| 久久午夜av| 亚洲电影中文字幕在线观看| 激情另类综合| 国产精品天干天干在观线| 成人黄色小视频| 日韩西西人体444www| 狠狠色丁香婷婷综合| 在线观看视频一区二区欧美日韩| 亚洲亚洲精品在线观看| 亚洲高清激情| 国产精品久久久久影院色老大| 成人av影院在线| 91精品综合久久久久久| 精品一区二区三区免费视频| 在线一区二区观看| 免费成人你懂的| 亚洲一区二区毛片| 亚洲国产欧美另类丝袜| 亚洲精品影院在线观看| 亚洲女同女同女同女同女同69| 一区久久精品| 亚洲日本在线看| 亚洲高清精品中出| 亚洲欧洲精品成人久久奇米网| 欧美午夜a级限制福利片| 日本一区二区三区久久久久久久久不 | 色94色欧美sute亚洲线路二 | 欧美日韩综合网| 亚洲欧洲精品一区二区精品久久久| 99国产精品视频免费观看一公开 | 亚洲国产高清一区二区三区| 亚洲精品欧美在线| 美女黄网久久| 九一九一国产精品| 久久久午夜电影| 在线一区亚洲| 国产精品1区二区.| 国产精品污www在线观看| 亚洲永久免费精品| 激情亚洲综合在线| 久久久99免费| 国产一区成人| 国产乱子轮精品视频| 国产女主播视频一区二区| 亚洲欧美日韩国产| 极品少妇xxxx精品少妇| 久久在线免费观看| 一区二区91| 国产麻豆精品久久一二三| 亚洲国产高清不卡| 日本精品一级二级| 99久久精品免费看| 亚洲成av人片一区二区梦乃| 欧美日本精品一区二区三区| 成人伦理片在线| a在线播放不卡| 国产在线精品免费| 青青草国产精品亚洲专区无| 国产九九精品| 日韩免费高清av| 亚洲茄子视频| 免费在线视频一区| 久久久久久久久久久电影| 午夜亚洲一区| 天堂成人国产精品一区| 欧美α欧美αv大片| 99日韩精品| 国产精品夜夜嗨| 亚洲综合激情小说| 日韩欧美一级在线播放| 99在线精品视频在线观看| 国产一区在线视频| ...xxx性欧美| 欧美一区二区在线免费播放| 亚洲毛片视频| 亚洲第一福利视频在线| 亚洲黄色三级| 免费在线观看成人av| 国产日韩一区二区三区在线播放 | 激情文学一区| 国产精品视频| 亚洲清纯自拍| 精品国产污网站| 一区二区三区不卡在线观看| 欧美色图首页| 欧美三级视频在线观看| 中文字幕一区三区| 欧美精品欧美精品系列| 国产精品jizz在线观看美国 | 日本一区二区三区在线不卡| 欧美男生操女生| 亚洲欧美日韩在线综合| 欧美成人日韩| 国产高清精品在线| 日本三级韩国三级欧美三级| 伊人婷婷欧美激情| 国产精品网站在线观看| 精品国产一区二区精华| 欧洲色大大久久| 国产精品久久久一区二区三区| 欧美国产一区二区三区激情无套| 日本aⅴ精品一区二区三区| 亚洲欧美日韩在线不卡| 欧美精品一区二区不卡| 欧美日本国产一区| 久久一区中文字幕| 99国产精品久久久久久久成人热| 欧美成人首页| 成人免费的视频| 九色|91porny| 日韩电影一二三区| 亚洲精品你懂的| 中文字幕一区二区三区在线观看| 精品少妇一区二区三区在线播放| 欧美日韩视频在线第一区 | 九九久久精品视频| 无码av中文一区二区三区桃花岛| 亚洲精品免费一二三区| 国产喂奶挤奶一区二区三区| 日韩一级欧美一级| 欧美日韩成人综合在线一区二区| 久久精品系列| 亚洲自拍另类| 国产日本精品| 亚洲免费高清| 亚洲成人在线| 亚洲第一黄色| 亚洲国产欧美不卡在线观看| 黄色综合网站| 亚洲高清视频在线观看| 亚洲二区视频| 夜夜夜久久久| 日韩午夜在线| 一区二区三区视频在线播放| 91久久久久| 亚洲午夜视频| 在线观看日韩av电影| 国产一区观看| 韩日精品视频| 亚洲国产午夜| 影音先锋中文字幕一区| 亚洲午夜精品久久| 亚洲黄色在线| 国产欧美三级| 色综合久久久久久久久久久| 日本丰满少妇一区二区三区| 色噜噜久久综合| 色婷婷久久久亚洲一区二区三区| 久久免费一区| 色悠悠久久综合| 欧美色窝79yyyycom| 欧美日韩免费电影| 欧美一级二级在线观看| 日韩欧美色电影| 精品国产sm最大网站免费看| 欧美一区二区三区免费| 欧美电影免费观看高清完整版在 | 欧美日韩一区二区电影| 欧美日本一道本| 欧美大胆一级视频| 久久精品一区二区三区不卡| 国产欧美中文在线| 亚洲精选在线视频| 日韩中文字幕亚洲一区二区va在线|