解決drf_yasg中的SwaggerAPI無法正確分組問題

畫星星高手發表於2020-08-07

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 等可獲取相關技術文章和資料,同時有任何問題都可以在公眾號後臺留言~

相關文章