解決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分組,所以就會出現下面這種未分組的效果。
## 未分組效果
![](https://upload-images.jianshu.io/upload_images/8869373-7bf761f0d705c0d8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 分組後效果
![](https://upload-images.jianshu.io/upload_images/8869373-bc4f9479e46c4a9f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 解決方法
定義一個類,繼承自`SwaggerAutoSchema`,用於自定義配置tags,我們自己決定要用哪一級的URL來做分組tag。
建立檔案,本例是:`config/swagger.py`
```python
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`裡面配置一下:
```python
# Swagger 配置
SWAGGER_SETTINGS = {
'DEFAULT_AUTO_SCHEMA_CLASS': 'config.swagger.CustomSwaggerAutoSchema',
}
```
這樣就可以了~
## 參考資料
- [https://github.com/axnsan12/drf-yasg/issues/489](https://github.com/axnsan12/drf-yasg/issues/489)
## 歡迎交流
我整理了一系列的技術文章和資料,在公眾號「程式設計實驗室」後臺回覆 linux、flutter、c#、netcore、android、kotlin、java、python 等可獲取相關技術文章和資料,同時有任何問題都可以在公眾號後臺