swagger是後臺開發中很好用的互動式文件,Django原本的Django-Swagger已經停止維護了,現在一般用drf_yasg
這個包來實現文件,它裡面支援swagger和redoc兩種,redoc是靜態的,作為匯出文件的話不錯,不過一般我們用swagger,因為可以在文件裡面除錯,非常方便。
Drf裡面有個東西是AutoSchema,可以自動掃描ViewSet和APIView這類可以提供介面的地方,和Spring裡面基於註解的文件定義不同,一般在Drf裡不需要手動配置每個介面的名稱和說明,只要寫在pydoc裡面就行,不過這個AutoSchema也不是很準確,他是按照URL,特別是我們這種多級URL的,就會只按照第一級URL分組,所以就會出現下面這種未分組的效果。
未分組效果
分組後效果
解決方法
定義一個類,繼承自SwaggerAutoSchema
,用於自定義配置tags,我們自己決定要用哪一級的URL來做分組tag。
建立檔案,本例是:config/swagger.py
from drf_yasg.inspectors import SwaggerAutoSchema
class CustomSwaggerAutoSchema(SwaggerAutoSchema):
def get_tags(self, operation_keys=None):
tags = super().get_tags(operation_keys)
if "v1" in tags and operation_keys:
# `operation_keys` 內容像這樣 ['v1', 'prize_join_log', 'create']
tags[0] = operation_keys[1]
return tags
然後我們在settings
裡面配置一下:
# Swagger 配置
SWAGGER_SETTINGS = {
'DEFAULT_AUTO_SCHEMA_CLASS': 'config.swagger.CustomSwaggerAutoSchema',
}
這樣就可以了~
參考資料
歡迎交流
我整理了一系列的技術文章和資料,在公眾號「程式設計實驗室」後臺回覆 linux、flutter、c#、netcore、android、kotlin、java、python 等可獲取相關技術文章和資料,同時有任何問題都可以在公眾號後臺留言~