OpenAPI 3 python - flask: как использовать несколько типов контента в ответ - PullRequest
1 голос
/ 27 марта 2020

В документации OA3 говорится, что у вас может быть несколько типов контента ответа, таких как:


paths:
  /users:
    get:
      summary: Get all users
      responses:
        '200':
          description: A list of users
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ArrayOfUsers'
            application/xml:
              schema:
                $ref: '#/components/schemas/ArrayOfUsers'
            text/plain:
              schema:
                type: string

Как мне указать, что я хочу возвращать указанный тип контента c в контроллере сгенерировано python - flask app?

Вот часть ответа spe c, которую я пытаюсь реализовать:

      responses:
        "200":
          description: successful operation
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CoordinateResponse"
            text/csv:
              schema:
                type: string

У меня есть строковая переменная с именем response_value в моем контроллере с содержимым файла CSV.

Я пробовал несколько разных вещей, например,

return response_value, 200, {'Content-Type': 'text/csv; charset=utf-8'}

выдает ответ с Content-Type: application/json

и

from connexion.lifecycle import ConnexionResponse
return ConnexionResponse(body=response_value, status_code=200, content_type='text/csv')

не дают ответа

и

from flask import Response
return Response(response_value, mimetype='text/csv')

не дают ответа

и

from flask import make_response
output = make_response(response_value)
output.headers["Content-type"] = "text/csv"
return output

не дает ответа

Как мне заставить его ответить Content-Type: text/csv?

1 Ответ

0 голосов
/ 27 марта 2020

Наконец-то все заработало вот так:

            from io import BytesIO
            mem = BytesIO()
            mem.write(response_value.encode('utf-8'))
            mem.seek(0)

            from flask import send_file
            return send_file(
                mem,
                as_attachment=True,
                attachment_filename="somefile.csv",
                mimetype='text/csv'
            )

Как только я опубликую вопрос на стеке, я наткнулся на ответ. История моей жизни.

...