日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Django REST Swagger實(shí)現(xiàn)指定api參數(shù)

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

為什么要指定swagger的api參數(shù)

api的參數(shù)有多種類型:

query 參數(shù),如 /users?role=admin

path 參數(shù),如 /users/{id}

header 參數(shù),如 X-MyHeader: Value

body 參數(shù),描述POST,PUT,PATCH請求的body

form 參數(shù),描述 Content-Type of application/x-www-form-urlencoded 和 multipart/form-data 的請求報(bào)文body的參數(shù)

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

Django REST Swagger實(shí)現(xiàn)指定api參數(shù)

難點(diǎn)

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

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

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

一種解決方案

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

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()

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

啟發(fā)

查閱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)

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

更好的解決方法

創(chuàng)建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參數(shù)的視圖類(如APIView或ModelViewSet)中重載schema:

schema = CustomSchema()

以上這篇Django REST Swagger實(shí)現(xiàn)指定api參數(shù)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Django
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
美女高潮久久久| 国产极品模特精品一二| 精品国产不卡一区二区| 国产成人1区| 欧美日韩精品一区二区视频| 婷婷综合五月| 最新国产精品| 精品一区二区三区亚洲| 美女福利一区二区三区| 国产一区欧美| 日本a口亚洲| 国产精品黑丝在线播放| 影音先锋久久| 久久gogo国模啪啪裸体| 99久久夜色精品国产亚洲1000部| 久久久国产亚洲精品| 亚洲欧美日韩国产综合精品二区| 欧美一级全黄| 精精国产xxxx视频在线播放| 亚洲精品美女91| 精品久久中文| 蜜臀久久99精品久久久久久9| 国产欧美日韩一级| 亲子伦视频一区二区三区| 水野朝阳av一区二区三区| 欧美国产亚洲精品| 91精品电影| 国产精品色在线网站| 欧美~级网站不卡| 国产人成精品一区二区三| 久草免费在线视频| 免费看欧美美女黄的网站| 麻豆成人91精品二区三区| 日韩网站在线| 福利一区视频| 日韩精品一区二区三区中文| 精品欧美一区二区三区在线观看| 免费在线成人网| 黑人精品一区| 日韩二区在线观看| 国内精品99| 精品美女视频 | 亚洲一区成人| 国产日产一区| 91九色精品| 精品视频一区二区三区四区五区 | 99久久精品网| 国产精品一区二区av交换| 激情欧美国产欧美| 国产一区日韩| 国产亚洲一卡2卡3卡4卡新区| 日韩一级网站| 日韩欧美一区二区三区免费看| 午夜性色一区二区三区免费视频| 91精品啪在线观看国产18| 欧美国产亚洲精品| 亚洲精品裸体| 在线观看免费一区二区| 麻豆国产在线| 国产精品99久久久久久董美香| 亚洲精品日本| 午夜精品亚洲| 久久婷婷久久| 国产自产自拍视频在线观看| 国产极品模特精品一二| 日韩av不卡一区二区| 在线精品一区| 美女尤物久久精品| 狠狠爱www人成狠狠爱综合网| 日韩久久电影| 国产网站在线| 国际精品欧美精品| 久久国产乱子精品免费女| 免费成人在线视频观看| 亚洲大全视频| 久久精品高清| 99精品电影| 成人羞羞在线观看网站| 欧美精品日日操| 黄在线观看免费网站ktv| 日韩1区在线| 欧美男人天堂| 日韩精品一区二区三区免费观影 | 成人午夜在线| 国产精品乱战久久久| 日韩成人午夜精品| 中文字幕亚洲影视| 老牛影视一区二区三区| 美女尤物久久精品| 蜜臀久久99精品久久久久宅男| 香蕉成人久久| 亚洲精选久久| 日韩综合一区二区三区| 亚洲视频二区| 亚洲91网站| 久久狠狠久久| 久久精品97| 久久精品国产福利| 成人亚洲欧美| 免费久久精品| 三级亚洲高清视频| 日本91福利区| 精品精品久久| 高清av不卡| 欧美1区免费| 免费在线观看精品| 国产日韩免费| 国产高清不卡| 国产亚洲一级| 91成人在线网站| 久久99国产精品视频| 久久99久久人婷婷精品综合| 国产夫妻在线| 日韩午夜高潮| 日韩二区三区四区| 国产成人精品一区二区三区免费 | 日韩美女精品| 欧美精品91| 国产91欧美| 黄色成人在线网址| 欧美中文高清| 久久尤物视频| 精品成人免费一区二区在线播放| 亚州av乱码久久精品蜜桃| 亚洲影视一区二区三区| 国产精品日本一区二区不卡视频| 国产精品毛片久久| 香蕉久久久久久久av网站| 国产精品美女在线观看直播| 日韩av免费| 少妇精品久久久一区二区三区| 久久精品免视看国产成人| 激情五月综合| 日本不卡一区二区| 成人日韩在线观看| 日韩精品久久理论片| 精品国产一区二| 国产精品日韩久久久| 久久亚洲精精品中文字幕| 免费观看久久av| 国产日韩欧美一区二区三区| 日韩精品免费一区二区三区| 日韩免费精品| 极品日韩av| 国产精品www994| 亚洲一区成人| 日本а中文在线天堂| 亚洲精品日本| 99久久亚洲精品蜜臀| 日本午夜精品久久久| 美女少妇全过程你懂的久久| 日韩久久99| 色爱av综合网| 国产欧美一级| 国产色综合网| 青青青免费在线视频| 欧美在线首页| 好吊一区二区三区| 亚洲黄色中文字幕| 国产亚洲人成a在线v网站| 亚洲精品在线观看91| 国产一区二区三区亚洲| 一二三区精品| 91精品国产福利在线观看麻豆| 国产精一区二区| 综合国产精品| 亚洲婷婷在线| 国产videos久久| 国产精品一区二区美女视频免费看 | 日韩不卡在线观看日韩不卡视频| 亚洲精品在线影院| 麻豆91在线播放| 日韩国产高清在线| 一区在线免费| 日韩精品影视| 黄色网一区二区| 欧美在线不卡| 每日更新成人在线视频| 日韩电影免费网址| 国产精品1区| 日韩精品a在线观看91| 狠狠色综合网| 91精品婷婷色在线观看| 97精品国产福利一区二区三区| 国产精品一线天粉嫩av| 香蕉久久一区| 亚洲精品乱码久久久久久蜜桃麻豆| 午夜日韩在线| 九一国产精品| 99久久精品网| 精品免费av在线| 色88888久久久久久影院| 最近高清中文在线字幕在线观看1| 亚洲精品大片| 色综合视频一区二区三区日韩 | 久久久久久久久久久妇女| 波多视频一区| 日韩一区二区中文| www.com.cn成人| 亚洲综合电影|