• 记一次:Python的学习笔记五(Django集成swagger)


    上一篇集成在了gatway上了,但给别人使用swagger的时候还是没有文档,如何集成swagger呢?

    python版本:Python 3.11.5

    Django版本:4.2.7

    0、Swagger 文档介绍

    Swagger 是一种用于 RESTful API 的开源框架,可以帮助开发者快速构建和文档化 API。Swagger 文档提供了一种自动生成和可视化 API 文档的方式,使得 API 的设计和使用更加简单和易懂。Swagger 文档通过描述 API 的路径、参数、请求体、响应和错误码等信息,让开发者可以快速了解 API 的设计和使用方式,方便开发者进行 API 的集成和调用。

    Swagger 2.0 是 Swagger 规范的第二个版本,引入了许多新的功能和改进。与第一个版本相比,Swagger 2.0 添加了对 WebSockets、OAuth2、文件上传和下载等功能的支持,并且提高了描述 API 的精确度和可读性。Swagger 2.0 还提供了一种可扩展的方式,让开发者可以为自己的 API 添加自定义的元数据信息。

    OpenAPI 3.0 是 Swagger 的下一代规范,为 RESTful API 提供了一种标准的描述和交互方式。与 Swagger 2.0 相比,OpenAPI 3.0 提供了更严格的模式验证和错误处理,支持更多的数据类型和协议,同时还提供了更好的安全性和可扩展性。OpenAPI 3.0 还提供了更好的分层描述方式,让开发者可以更好地组织和管理 API 的文档。

    那么我们怎么在 Django 项目中集成 Swagger 功能呢?我介绍两个工具 drf-yasg 和 drf-spectacular。

    1、drf-yasgdrf-spectacular介绍

    drf-yasg 介绍

    https://github.com/axnsan12/drf-yasg

    drf-yasg 也是一个基于 DRF 的 API 文档生成工具,同样支持 Swagger 2.0规范,并提供了自动生成文档和交互式文档页面的功能。它的特点是支持动态生成 Swagger UI,支持多种主题,可以自定义 API 文档样式,同时也提供了一些有用的功能,比如支持在文档中隐藏指定字段、支持在文档中添加额外的参数等。

    drf-spectacular介绍

    https://github.com/tfranzel/drf-spectacular

    drf-spectacular 是一个基于 DRF 的 API 文档生成工具,支持 OpenAPI 3.0规范,并提供了自动生成文档和交互式文档页面的功能。它支持自定义的扩展和重载,可以满足不同项目的需求,同时还提供了一些有用的功能,比如支持通过代码自动注册 API 视图、支持自定义请求和响应验证器等。

    2、使用drf-spectacular 自动生成 OpenAPI 3.0 文档

    如果新使用的是 OpenAPI 3.0 的文档,那么只能采用的是 drf-spectacular。

    Drf-spectacular源码路径:GitHub - tfranzel/drf-spectacular: Sane and flexible OpenAPI 3 schema generation for Django REST framework.

    版本信息查看,符合我的版本要求

    大体安装流程

    2.1安装 drf-spectacula

    pip install drf-spectacular

    2.2 在 settings.py 中配置

    配置安装程序

    1. INSTALLED_APPS = [
    2. # ALL YOUR APPS
    3. 'drf_spectacular',
    4. ]

    在settings.py最下面注册到 DRF Django Rest Framework=>配置DRF默认schema

    1. REST_FRAMEWORK = {
    2. # YOUR SETTINGS
    3. 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
    4. }

    还是在settings.py最下面,自定义OpenApi 描述

    1. SPECTACULAR_SETTINGS = {
    2. 'TITLE': 'Your Project API',
    3. 'DESCRIPTION': 'Your project description',
    4. 'VERSION': '1.0.0',
    5. 'SERVE_INCLUDE_SCHEMA': False,
    6. # OTHER SETTINGS
    7. }

    2.3静态资源引入

    drf-spectacular 默认不包含UI资源,采用CDN方式引入网络外部资源,如果需要本地使用UI资源,可以按照一下方式引入:

    安装ui命令:

     pip install drf-spectacular[sidecar]

    配置settings.py文件

    1. INSTALLED_APPS = [
    2. # ALL YOUR APPS
    3. 'drf_spectacular',
    4. 'drf_spectacular_sidecar', # required for Django collectstatic discovery
    5. ]
    6. SPECTACULAR_SETTINGS = {
    7. 'SWAGGER_UI_DIST': 'SIDECAR', # shorthand to use the sidecar instead
    8. 'SWAGGER_UI_FAVICON_HREF': 'SIDECAR',
    9. 'REDOC_DIST': 'SIDECAR',
    10. # OTHER SETTINGS
    11. }

    注意:SPECTACULAR_SETTINGS,与之前的重复进行合并处理

    2.4路由配置

    在根urls.py中增加路由配置

    1. from drf_spectacular.views import SpectacularJSONAPIView, SpectacularRedocView, SpectacularSwaggerView
    2. urlpatterns = [
    3. path('swagger/json/', SpectacularJSONAPIView.as_view(), name='schema'),
    4. # Optional UI:
    5. path('swagger/ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
    6. path('swagger/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'), # YOUR PATTERNS
    7. ]

    2.5访问测试

    访问路径:http://localhost:8000/swagger/ui/

    文档没有接口,是因为我们接口还没有添加api注释相关的内容。如何使用呢?

    2.6 接口添加注释

    官方给的截图

    1. from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiExample
    2. from drf_spectacular.types import OpenApiTypes
    3. class AlbumViewset(viewset.ModelViewset):
    4. serializer_class = AlbumSerializer
    5. @extend_schema(
    6. request=AlbumCreationSerializer,
    7. responses={201: AlbumSerializer},
    8. )
    9. def create(self, request):
    10. # your non-standard behaviour
    11. return super().create(request)
    12. @extend_schema(
    13. # extra parameters added to the schema
    14. parameters=[
    15. OpenApiParameter(name='artist', description='Filter by artist', required=False, type=str),
    16. OpenApiParameter(
    17. name='release',
    18. type=OpenApiTypes.DATE,
    19. location=OpenApiParameter.QUERY,
    20. description='Filter by release date',
    21. examples=[
    22. OpenApiExample(
    23. 'Example 1',
    24. summary='short optional summary',
    25. description='longer description',
    26. value='1993-08-23'
    27. ),
    28. ...
    29. ],
    30. ),
    31. ],
    32. # override default docstring extraction
    33. description='More descriptive text',
    34. # provide Authentication class that deviates from the views default
    35. auth=None,
    36. # change the auto-generated operation name
    37. operation_id=None,
    38. # or even completely override what AutoSchema would generate. Provide raw Open API spec as Dict.
    39. operation=None,
    40. # attach request/response examples to the operation.
    41. examples=[
    42. OpenApiExample(
    43. 'Example 1',
    44. description='longer description',
    45. value=...
    46. ),
    47. ...
    48. ],
    49. )
    50. def list(self, request):
    51. # your non-standard behaviour
    52. return super().list(request)
    53. @extend_schema(
    54. request=AlbumLikeSerializer,
    55. responses={204: None},
    56. methods=["POST"]
    57. )
    58. @extend_schema(description='Override a specific method', methods=["GET"])
    59. @action(detail=True, methods=['post', 'get'])
    60. def set_password(self, request, pk=None):
    61. # your action behaviour
    62. ...

    找一个最简单的接口添加

    1. from rest_framework.decorators import api_view
    2. from drf_spectacular.utils import extend_schema, OpenApiExample, inline_serializer
    3. @extend_schema(
    4. responses={
    5. (200, 'text/html'): {
    6. 'description': 'Simple HTML page',
    7. 'type': 'string',
    8. 'example': 'Example text'
    9. },
    10. (202, 'application/json'): {
    11. 'description': 'JSON response',
    12. 'type': 'object',
    13. 'properties': {
    14. 'title': {
    15. 'type': 'string',
    16. 'minLength': 1,
    17. 'maxLength': 128
    18. }
    19. },
    20. 'required': [
    21. 'title'
    22. ]
    23. },
    24. }
    25. )
    26. @api_view(['GET'])
    27. def test2(request):
    28. # cache.set('hobby', 'film')
    29. print(cache.get('hobby'))
    30. return HttpResponse('缓存成功')

    2.7 再次访问测试验证

    在访问刚才的swagger地址

     

    2.8 属性标签介绍

    如果想要修改指定接口所属的标签,我们可以使用drf-spectacular提供的extend_schema装饰器函数,函数定义如下:

    1. def extend_schema(
    2. operation_id: Optional[str] = None,
    3. parameters: Optional[Sequence[Union[OpenApiParameter, _SerializerType]]] = None,
    4. request: Any = empty,
    5. responses: Any = empty,
    6. auth: Optional[Sequence[str]] = None,
    7. description: Optional[_StrOrPromise] = None,
    8. summary: Optional[_StrOrPromise] = None,
    9. deprecated: Optional[bool] = None,
    10. tags: Optional[Sequence[str]] = None,
    11. filters: Optional[bool] = None,
    12. exclude: Optional[bool] = None,
    13. operation: Optional[Dict] = None,
    14. methods: Optional[Sequence[str]] = None,
    15. versions: Optional[Sequence[str]] = None,
    16. examples: Optional[Sequence[OpenApiExample]] = None,
    17. extensions: Optional[Dict[str, Any]] = None,
    18. callbacks: Optional[Sequence[OpenApiCallback]] = None,
    19. external_docs: Optional[Union[Dict[str, str], str]] = None,
    20. ) -> Callable[[F], F]:

    这个装饰器主要用于修改view在文档中的定义,参数意义如下:

    operation_id:一个唯一标识ID,基本用不到

    parameters:添加到列表中的附加或替换参数去自动发现字段。

    responses:替换Serializer。需要各种各样的可单独使用或组合使用的输入(有以下7种) Serializer类 序列化实例,比如:Serializer(many=True) OpenApiTypes的基本类型或者实例 OpenApiResponse类 PolymorphicProxySerializer类 1个字典,以状态码作为键, 以上其中一项作为值(是最常用的,格式{200, None}) 1个字典,以状态码作为键,以media_type作为值

    request:替换序列化,接受各种输入 Serializer 类或者实例 OpenApiTypes基本类型或者实例 PolymorphicProxySerializer类 1个字典,以media_type作为键,以上其中一项作为值

    auth:用auth方法的显式列表替换发现的auth

    description:替换发现的文档字符串

    summary:一个可选的短的总结描述

    deprecated:将操作标记为已弃用

    tags:覆盖默认标记列表

    exclude:设置为True以从schema中排除操作

    operation:手动覆盖自动发现将生成的内容。你必须提供一个兼容OpenAPI3的字典,该字典可以直接翻译成YAML。

    methods:检查extend_schema中特殊的方法,默认匹配所有

    versions:检查extend_schema中特殊的API版本,默认匹配所有

    example:将请求/响应示例附加到操作中

    extensions:规范扩展

  • 相关阅读:
    DSPE-PEG-Silane,磷脂-聚乙二醇-硅烷,修饰二氧化硅颗粒用科研试剂
    洛谷P5731 【深基5.习6】蛇形方阵java版题解
    jmeter 常见的性能插件
    电商接口中API key 和 token 有什么区别?
    AOP-简介,面向切面编程好处,AOP编程术语,AspectJ(通知类型,切入点表达式)
    网站SEO效果分析
    听大佬讲:学习 AXI从哪里开始?
    [附源码]SSM计算机毕业设计学习资源共享与在线学习系统JAVA
    C++报错信息:LNK2001:无法解析的外部符号 原因分析及解决方法
    【华为OD机试真题 python】 停车场车辆统计【2022 Q4 | 100分】
  • 原文地址:https://blog.csdn.net/sinat_38259539/article/details/136259824