【问题标题】:Custom path parameter parsing drf-yasg and Django自定义路径参数解析 drf-yasg 和 Django
【发布时间】:2020-05-07 10:24:13
【问题描述】:

我正在尝试强制dry-yasg 正确解析路径中的参数。假设我们有

path('users/<int:user_id>/', whatever.as_view(...))

在 swagger 文档中,它不被视为int,而是string

我用过

swagger_auto_schema(manual_parameters = [
openapi.Parameter(
        name,
        openapi.IN_PATH,
        description=desc,
        type=openapi.TYPE_INTEGER,
        required=True
    )
]

但这很烦人。我找不到负责解析它的函数/方法/类。是否有一种简单的方法可以根据路径更改此解析器的行为,以便如果发生int,则将返回openapi.TYPE_INTEGER 而不是string

【问题讨论】:

  • 您的 anwser 帮助我解决了我遇到的另一个问题 .. 谢谢。将来,请尝试将导入添加到您的文件中以帮助其他人。

标签: python django django-rest-framework drf-yasg


【解决方案1】:

自动判断参数类型in some situations,如果检测失败则返回字符串。

queryset = get_queryset_from_view(view_cls)

for variable in sorted(uritemplate.variables(path)):
    model, model_field = get_queryset_field(queryset, variable)
    attrs = get_basic_type_info(model_field) or {'type': openapi.TYPE_STRING}

如您所见,它尝试根据视图查询集的列类型获取类型。但是,如果您的参数名称与查询集中的任何内容都不匹配,则会得到一个字符串。所以你的第一选择应该是尝试使用它可以自动检测的名称。

如果这不起作用,您将需要继承 EndpointEnumerator 并覆盖 get_path_parameters(),这可能是最简单的调用 super().get_path_parameters() 并检查每个参数并根据变量名替换类型。

要使用这个类,你需要your own OpenAPISchemaGenerator

  • 使用自定义 OpenAPISchemaGenerator
  • 用您自己的 EndpointEnumerator 覆盖其 endpoint_enumerator_class

【讨论】:

  • 这是非常有趣的信息。感谢那!虽然不能解决我的问题,因为path 已经是path/{user_id},而不是path/&lt;int:user_id&gt;
  • 然后你可以尝试预处理路径中的args,将你的类型信息提取到{"user_id": :"int"},将路径中的所有名称替换为不带类型的名称,调用super(),然后进行后处理根据您提前提取的数据设置每个类型的输出。
猜你喜欢
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 2022-10-05
  • 2019-07-27
相关资源
最近更新 更多