欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django REST Swagger實現指定api參數

 更新時間:2020年07月07日 09:21:47   作者:Z_J_Q_  
這篇文章主要介紹了Django REST Swagger實現指定api參數,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

為什么要指定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文檔,可以直接填入文檔顯示的參數的值并發(fā)送請求,返回的結果就會在文檔中顯示。

難點

對 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 FilterSet

class 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參數名與模型字段名不一致時還要額外處理。

啟發(fā)

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

from rest_framework.response import Response
from rest_framework.schemas import SchemaGenerator
from rest_framework.views import APIView
from rest_framework_swagger import renderers

class 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變量。

更好的解決方法

創(chuàng)建schema_view.py:

from django.utils.six.moves.urllib import parse as urlparse
from rest_framework.schemas import AutoSchema
import yaml
import coreapi
from rest_framework_swagger.views import get_swagger_view

class 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_view

urlpatterns = [
 url(r'^v1/api/', include([
 url(r'^doc/', schema_view),
 ])),

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

schema = CustomSchema()

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

相關文章

  • Django接收照片儲存文件的實例代碼

    Django接收照片儲存文件的實例代碼

    這篇文章主要介紹了Django接收照片儲存文件的實例代碼 ,代碼簡單易懂,非常不錯,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • python如何實現向上取整

    python如何實現向上取整

    這篇文章主要介紹了python如何實現向上取整問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 在Python 3中實現類型檢查器的簡單方法

    在Python 3中實現類型檢查器的簡單方法

    這篇文章主要介紹了在Python 3中實現類型檢查器的簡單方法,包括對函數注解這個新特性的介紹,需要的朋友可以參考下
    2015-07-07
  • 使用python加密主機文件幾種方法實現

    使用python加密主機文件幾種方法實現

    本文主要介紹了使用python加密主機文件幾種方法實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Python 3.10 中 6 個興奮的新特性

    Python 3.10 中 6 個興奮的新特性

    Python 是當今最流行的編程語言之一其流行的原因有很多種,Python 3.10 有幾個新的很酷的功能,使得使用 Python 成為一種更好的體驗。在本文中,我將與您分享 6 個讓我最興奮的新特性,感興趣的朋友一起看看吧
    2021-10-10
  • Python3中簡單的文件操作及兩個簡單小實例分享

    Python3中簡單的文件操作及兩個簡單小實例分享

    文件操作是我們日常在使用python的時候經常會用到的,下面這篇文章主要給大家介紹了關于Python3中簡單的文件操作及兩個簡單小實例的相關資料,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • Python基于xlrd模塊操作Excel的方法示例

    Python基于xlrd模塊操作Excel的方法示例

    這篇文章主要介紹了Python基于xlrd模塊操作Excel的方法,結合實例形式分析了xlrd模塊的安裝及Python使用xlrd模塊模塊進行Excel的讀寫相關操作技巧,需要的朋友可以參考下
    2018-06-06
  • Python3.4編程實現簡單抓取爬蟲功能示例

    Python3.4編程實現簡單抓取爬蟲功能示例

    這篇文章主要介紹了Python3.4編程實現簡單抓取爬蟲功能,涉及Python3.4網頁抓取及正則解析相關操作技巧,需要的朋友可以參考下
    2017-09-09
  • Python使用gTTS庫實現文本轉換為語音的詳細步驟

    Python使用gTTS庫實現文本轉換為語音的詳細步驟

    文本轉換為語音(Text-to-Speech,簡稱TTS)技術是人工智能的重要組成部分,廣泛應用于智能助手、導航系統(tǒng)、讀屏軟件和智能家居等領域,TTS技術使得機器能夠將書面文字轉換為自然流暢的語音,本文將介紹如何使用Python的gTTS庫實現簡單的TTS功能,需要的朋友可以參考下
    2024-07-07
  • 詳解如何通過Python制作一個密碼生成器

    詳解如何通過Python制作一個密碼生成器

    定期更換密碼是一種非常重要的安全措施,這種做法可以有效地保護你的賬戶和個人信息不受黑客和網絡攻擊者的侵害。所以本文就來用Python制作一個密碼生成器吧
    2023-05-05

最新評論