Как создать сервер Python Flask с OpenAPI Generator, который ссылается на мою собственную реализацию * _controller.py? - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу сгенерировать сервер Python Flask, предоставив в качестве входных данных определенную спецификацию OpenAPI - скажем, foo.yaml - с помощью следующей команды:

java -jar openapi-generator-cli.jar generate -i foo.yaml -g python-flask -o python-flask_api_server

Однако при этом генерируется заглушка сервера, содержащая файл с именем foo_controller.py в \ python-flask_api_server \ openapi_server \ controllers , и каждый метод, определенный в этом файле, возвращает одну и ту же строку шаблона:

'совершают магию! '

foo_controller.py

def foo_post(inline_object=None):  # noqa: E501
"""Create a foo

 # noqa: E501

:param inline_object: 
:type inline_object: dict | bytes

:rtype: str
"""
if connexion.request.is_json:
    inline_object = InlineObject.from_dict(connexion.request.get_json())  # noqa: E501
return 'do some magic!'

Что я пытаюсь сделать с OpenAPI Generator - это создать заглушку сервера, чей foo_controller.py ссылается на мою собственную реализацию этого файла, например, вот так:

foo_controller.py (созданный файл)

import foo_controller_impl

def foo_post(inline_object=None):  # noqa: E501
"""Create a foo

 # noqa: E501

:param inline_object: 
:type inline_object: dict | bytes

:rtype: str
"""
foo_controller_impl.foo_post_impl(inline_object)

foo_controller_impl.py (моя реализация foo_controller.py)

def foo_post_impl(inline_object=None):  # noqa: E501
if connexion.request.is_json:
    inline_object = InlineObject.from_dict(connexion.request.get_json())  # noqa: E501
print("Request body is:\n" + str(inline_object))
response = "/foo/1"
return response

Я выполнил следующую команду для создания нового набора шаблонов:

java -jar openapi-generator-cli.jar meta -o my-codegen -n myCodegen -p org.openapitools.codegen

Но после прочтения сгенерированного README.md и проверка MycodegenGenerator.java мне до сих пор не очень понятно, как мне этого добиться.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 18 февраля 2019

Решением моей проблемы было загрузить Swagger Codegen ( link ), найти файл шаблона controller.mustache для сервера Python-Flask (расположен здесь: swagger-codegen-master \ modules \ swagger-codegen \ src \ main \ resources \ flaskConnexion ) и отредактируйте его следующим образом:

from {{packageName}}.controllers import {{classname}}_impl
{{#operations}}
{{#operation}}


def {{operationId}}({{#allParams}}{{paramName}}{{^required}}=None{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}):  # noqa: E501
    """{{#summary}}{{.}}{{/summary}}{{^summary}}{{operationId}}{{/summary}}

    {{#notes}}{{.}}{{/notes}} # noqa: E501

    {{#allParams}}
    :param {{paramName}}: {{description}}
        {{^isContainer}}
            {{#isPrimitiveType}}
    :type {{paramName}}: {{>param_type}}
            {{/isPrimitiveType}}
            {{#isUuid}}
    :type {{paramName}}: {{>param_type}}
            {{/isUuid}}
            {{^isPrimitiveType}}
                {{#isFile}}
    :type {{paramName}}: werkzeug.datastructures.FileStorage
                {{/isFile}}
                {{^isFile}}
                    {{^isUuid}}
    :type {{paramName}}: dict | bytes
                    {{/isUuid}}
                {{/isFile}}
            {{/isPrimitiveType}}
        {{/isContainer}}
        {{#isListContainer}}
            {{#items}}
                {{#isPrimitiveType}}
    :type {{paramName}}: List[{{>param_type}}]
                {{/isPrimitiveType}}
                {{^isPrimitiveType}}
    :type {{paramName}}: list | bytes
                {{/isPrimitiveType}}
            {{/items}}
        {{/isListContainer}}
        {{#isMapContainer}}
            {{#items}}
                {{#isPrimitiveType}}
    :type {{paramName}}: Dict[str, {{>param_type}}]
                {{/isPrimitiveType}}
                {{^isPrimitiveType}}
    :type {{paramName}}: dict | bytes
                {{/isPrimitiveType}}
            {{/items}}
        {{/isMapContainer}}
    {{/allParams}}

    :rtype: {{#returnType}}{{.}}{{/returnType}}{{^returnType}}None{{/returnType}}
    """
    return {{classname}}_impl.{{operationId}}({{#allParams}}{{paramName}}{{^required}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
{{/operation}}
{{/operations}}

Наконец, я использовал следующую команду для генерации Python-Flaskсервер:

java -jar swagger-codegen-cli-2.3.1.jar generate -i foo.yaml -l python-flask -o "swagger server\foo" -t swagger-codegen-master\modules\swagger-codegen\src\main\resources\flaskConnexion

Кредит идет Дуди за его ответ на аналогичный вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...