Обновление: я обнаружил проблему. Мое использование термина «Файл» для объекта в определениях, по-видимому, вызывает эту проблему. Я переименовал объект в «FileThing» как тест, и swagger-codegen сгенерировал ожидаемый объект модели и модуль. (Возможно, это связано с https://github.com/swagger-api/swagger-codegen/issues/3223?).
При использовании swagger-codegen для создания заглушки сервера Python Flask (Connexion) из спецификации OpenAPI v2 я не вижу никаких объектов модели в полученном исходном коде. Однако другие цели языка / API, такие как go-server, создают объекты модели. Я использую swagger-codegen-cli-2.3.1.jar. На данный момент моя спецификация очень проста и такова:
swagger: "2.0"
info:
version: 0.0.1
title: Blah API
description: An API for interacting with the blah system
paths:
/files:
get:
description: Retrieves information on files that match the specified criteria
produces:
- "application/json"
parameters:
- name: tags
type: array
description: The tags for which matching files are to be returned
in: query
items:
type: string
responses:
'200':
description: Successful response
schema:
type: array
items:
$ref: "#/definitions/File"
definitions:
File:
type: object
properties:
file_id:
type: "string"
format: "uuid"
path:
type: "string"
tags:
type: array
items:
type: "string"
Как видите, я ожидал увидеть объект модели, созданный для объекта File, определенного в разделе определений. Однако пакет моделей в Source / swagger_server содержит только модуль base_model.py без дополнительных определений, кроме самого класса базовой модели. Я запускаю swagger-codegen-cli следующим образом:
sknick@sknick:~/Repo/Blah/Server$ java -jar /home/sknick/Misc/swagger-codegen-cli-2.3.1.jar generate -l python-flask -o ./Source -i ./api.yaml
[main] INFO io.swagger.parser.Swagger20Parser - reading from ./api.yaml
[main] WARN io.swagger.codegen.DefaultCodegen - Empty operationId found for path: GET /files. Renamed to auto-generated operationId: filesGET
[main] INFO io.swagger.codegen.DefaultGenerator - Model File not imported due to import mapping
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/swagger_server/controllers/default_controller.py
[main] INFO io.swagger.codegen.DefaultGenerator - File exists. Skipped overwriting /home/sknick/Repo/Blah/Server/./Source/swagger_server/test/test_default_controller.py
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/README.md
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/setup.py
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/tox.ini
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/test-requirements.txt
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/requirements.txt
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/git_push.sh
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/.gitignore
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/.travis.yml
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/Dockerfile
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/.dockerignore
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/swagger_server/__init__.py
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/swagger_server/__main__.py
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/swagger_server/encoder.py
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/swagger_server/util.py
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/swagger_server/controllers/__init__.py
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/swagger_server/models/__init__.py
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/swagger_server/models/base_model_.py
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/swagger_server/test/__init__.py
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/swagger_server/swagger/swagger.yaml
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sknick/Repo/Blah/Server/./Source/.swagger-codegen/VERSION
Я пересмотрел свой вопрос. Спасибо за обратную связь.
Я также заметил, что вместо импорта файла из модуля Python, который он делал, import java.io.File, поэтому в инструменте есть какая-то ошибка.
Сообщил о возможной новой ошибке: github.com/swagger-api/swagger-codegen/issues/8134
Re: update - да, проблема №3223 выглядит так же. Вероятно, это было исправлено для некоторых генераторов, но не для python-flask.
Похоже на ошибку в генераторе python-flask, когда он не генерирует модели, соответствующие определенным именам классов Java, например File
, Date
, Set
и т. д. Поведение «игнорировать модель» настраивается в классе DefaultCodegen
через importMapping
здесь:
https://github.com/swagger-api/swagger-codegen/blob/master/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java#L835
Некоторые генераторы, такие как C#, очищают importMapping
, потому что они не используют сопоставления классов Java:
https://github.com/swagger-api/swagger-codegen/blob/master/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractCSharpCodegen.java#L56
importMapping.clear();
но генератор python-flask этого не делает. Вероятно, он также должен очистить importMapping
, но я не разработчик Python / Flask, поэтому я не уверен.
Я предлагаю вам открыть вопрос в репозитории Swagger Codegen и / или отправить PR.
А пока существуют некоторые возможные обходные пути:
FileDTO
.importMapping.clear()
и используйте свой собственный генератор.
Не могли бы вы пояснить, что вы имеете в виду под «не вижу ... объекты модели, созданные в сгенерированном коде»? Я только что сгенерировал python-flask для Petstore, а модели находятся в каталоге swagger-server \ models. Можете ли вы опубликовать свою спецификацию OpenAPI, фактические результаты и ожидаемые результаты? Какую версию Swagger Codegen вы используете?