Как настроить ответные сообщения для документации ReDoc OpenAPI в FastAPI?

Я разработал какое-то приложение FastAPI и хочу настроить его редок-документацию. Ниже приведен код для него:

from fastapi import FastAPI
from typing import Optional

import uvicorn

app = FastAPI()

class User(BaseModel):
    username: str

user_list = ["John", "Abrahim", "Kiana"]

#Get method to fetch some value
@app.get('/user/{id}/')
def users(id:int):
    return user_list[id]

#Request Bodies
#Post Method
@app.post('/user')
def add_user(request:User):
    return request.username


if __name__ == "__main__":
    uvicorn.run(app, host = "127.0.0.1",port=8000)

На данный момент я получаю ответ ниже в моей документации по редоку:

Я хочу добавить больше кодов ответов в редок, как показано ниже, а также хочу настроить сообщения для каждого кода. Не знаю, как это сделать, поэтому, пожалуйста, помогите в этом.

200 - OK    Everything worked as expected.
400 - Bad Request   The request was unacceptable, often due to missing a required parameter.
401 - Unauthorized  No valid API key provided.
402 - Request Failed    The parameters were valid but the request failed.
403 - Forbidden The API key doesn't have permissions to perform the request.
404 - Not Found The requested resource doesn't exist.
409 - Conflict  The request conflicts with another request (perhaps due to using the same idempotent key).
429 - Too Many Requests Too many requests hit the API too quickly. We recommend an exponential backoff of your requests.
500, 502, 503, 504 - Server Errors  Something went wrong on Stripe's end. (These are rare.)

Начните здесь: fastapi.tiangolo.com/advanced/additional-responses

Helen 14.04.2023 17:59

Отвечает ли это на ваш вопрос? Как настроить реакцию на ошибку в FastAPI?

Chris 14.04.2023 18:22

Смотрите похожие ответы здесь , а также здесь и здесь

Chris 14.04.2023 18:24

@Helen Поскольку мне нужно добавить несколько кодов состояния и настроить ответное сообщение, не могли бы вы помочь мне добавить несколько куплетов кода в приведенный выше пример?

Aadhi Verma 14.04.2023 18:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
216
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прямо из документации:

Вы можете захотеть иметь некоторые предопределенные ответы, которые применимы ко многим операции пути, но вы хотите объединить их с пользовательскими ответами, необходимыми для каждой операции пути.

В этих случаях вы можете использовать технику Python для «распаковки» dict с **dict_to_unpack:

json old_dict = {
    "old key": "old value",
    "second old key": "second old value", 
} 
new_dict = {**old_dict, "new key": "new value"} 

Здесь new_dict будет содержать все пары ключ-значение из old_dict плюс новая пара ключ-значение:

json {
    "old key": "old value",
    "second old key": "second old value",
    "new key": "new value", 
} 

Вы можете использовать эту технику для повторного использования некоторых предопределенных ответов в вашем операции пути и комбинировать их с дополнительными пользовательскими.

Рабочий пример

from typing import Union

from fastapi import FastAPI
from fastapi.responses import FileResponse
from pydantic import BaseModel


class Item(BaseModel):
    id: str
    value: str


responses = {
    404: {"description": "Item not found"},
    302: {"description": "The item was moved"},
    403: {"description": "Not enough privileges"},
}


app = FastAPI()


@app.get(
    "/items/{item_id}",
    response_model=Item,
    responses = {**responses, 200: {"content": {"image/png": {}}}},
)
async def read_item(item_id: str, img: Union[bool, None] = None):
    if img:
        return FileResponse("image.png", media_type = "image/png")
    else:
        return {"id": "foo", "value": "there goes my hero"}

спасибо за ответ, мне помогло. Я смог изменить код в соответствии с моим примером. Мне может понадобиться дополнительная помощь в этом. Я поставлю это в отдельный вопрос, если потребуется.

Aadhi Verma 17.04.2023 08:22

Я могу найти эти измененные ответы в редоке, но я не получаю эти измененные ответы в реальном приложении. Например, я не могу переопределить ответ внутренней ошибки сервера 500.

Aadhi Verma 17.04.2023 10:17

Объявление дополнительных responses для появления в документах API не означает, что содержание таких ответов/исключений будет автоматически изменено на те, которые вы указали. Как описано в документации , «... для этих дополнительных ответов вы должны убедиться, что вы возвращаете Response лайк JSONResponse напрямую, с вашим кодом состояния и содержанием». Пожалуйста, ознакомьтесь со ссылками, представленными в разделе комментариев выше, а также этот ответ

Chris 17.04.2023 14:41

Можем ли мы отредактировать или удалить панель образцов ответов справа.

Aadhi Verma 02.05.2023 16:12

Другие вопросы по теме