Основы разработки серверной части FastAPI (4): ошибки документации официального сайта FastAPI, ошибки кодирования и записи важных моментов, на которые следует обратить внимание.
Основы разработки серверной части FastAPI (4): ошибки документации официального сайта FastAPI, ошибки кодирования и записи важных моментов, на которые следует обратить внимание.

Установите, требуются ли параметры запроса

Используйте Annotated для оформления параметров запроса.

Не устанавливать значение по умолчанию

Язык кода:python
кодКоличество запусков:0
копировать
@app.get("/validation")
async def async_root(str_param: Annotated[str | None, Query(min_length = 3,
                                                            max_length = 20,
                                                            pattern = '^[a-zA-Z0-9]+$',
                                                            description = 'This is a string parameter')]):
    """
    Если не установлено str_param = None, но str_param требуется
    """
    ret = {"str_list": str_param}
    if str_param is not None:
        h = hashlib.sha3_512(str_param.encode('utf-8')).hexdigest()
        ret.update({"sha3_512": h})
    else:
        ret.update({"uuid": uuid.uuid4().hex})
    return ret
Нетнастраиватьпо умолчаниюценить
Нетнастраиватьпо умолчаниюценить
генерироватьиз Параметры в документетребуется
генерироватьиз Параметры в документетребуется

Установить значение по умолчанию

Язык кода:python
кодКоличество запусков:0
копировать
@app.get("/validation1")
async def async_root1(str_param: Annotated[str | None, Query(min_length = 3,
                                                             max_length = 20,
                                                             pattern = '^[a-zA-Z0-9]+$',
                                                             description = 'This is a string parameter')] = None):
    """
    настраивать str_param = None указать разрешение str_param Пусто (не обязательно)
    """
    ret = {"str_list": str_param}
    if str_param is not None:
        h = hashlib.sha3_512(str_param.encode('utf-8')).hexdigest()
        ret.update({"sha3_512": h})
    else:
        ret.update({"uuid": uuid.uuid4().hex})
    return ret
настраивать default ценить
настраивать default ценить
генерироватьиз Параметры в документедля非必填
генерироватьиз Параметры в документедля非必填

Значение по умолчанию типа строки

Язык кода:python
кодКоличество запусков:0
копировать
@app.get("/validation2")
async def async_root2(str_param: Annotated[str, Query(min_length = 3,
                                                      max_length = 20,
                                                      pattern = '^[a-zA-Z0-9]+$',
                                                      description = 'This is a string parameter')] = 'default_value'):
    """
    в это время str_list Существует значение по умолчанию, которое не является обязательным.
    """
    ret = {"str_list": str_param}
    if str_param is not None:
        h = hashlib.sha3_512(str_param.encode('utf-8')).hexdigest()
        ret.update({"sha3_512": h})
    else:
        ret.update({"uuid": uuid.uuid4().hex})
    return ret
по умолчаниюценитьдля string тип
по умолчаниюценитьдля string тип

Использовать многоточие по умолчанию

неправильный способ написания
Язык кода:python
кодКоличество запусков:0
копировать
@app.get("/validation3")
async def async_root3(str_param: Annotated[str, Query(min_length = 3,
                                                      max_length = 20,
                                                      pattern = '^[a-zA-Z0-9]+$',
                                                      description = 'This is a string parameter')] = ...):
    """
    в это время str_list = ... В сгенерированном документе str_list Неттребуется
    И при отправке запроса:
        curl -X 'GET' 'http://127.0.0.1:18081/validation3' -H 'accept: application/json'
    Фон сообщит об ошибке:
        ValueError: [TypeError("'ellipsis' object is not iterable"), TypeError('vars() argument must have __dict__ attribute')]
    """
    ret = {}
    if str_param is not ...:
        ret = {"str_list": str_param}
        h = hashlib.sha3_512(str_param.encode('utf-8')).hexdigest()
        ret.update({"sha3_512": h})
    else:
        ret.update({"uuid": uuid.uuid4().hex, 'error': 'str_list is ...'})
    return ret


@app.get("/validation4")
async def async_root4(str_param: Annotated[str | None, Query(min_length = 3,
                                                             max_length = 20,
                                                             pattern = '^[a-zA-Z0-9]+$',
                                                             description = 'This is a string parameter')] = ...):
    """
    Отправить: локон -X 'GET' 'http://127.0.0.1:18081/validation4' -H 'accept: приложение/json'
    Фон сообщит об ошибке:ValueError: [TypeError("'ellipsis' object is not iterable"), TypeError('vars() argument must have __dict__ attribute')]
    """
    ret = {}
    if str_param is not ...:
        ret = {"str_list": str_param}
        h = hashlib.sha3_512(str_param.encode('utf-8')).hexdigest()
        ret.update({"sha3_512": h})
    else:
        ret.update({"uuid": uuid.uuid4().hex, 'error': 'str_list is ...'})
    return ret

использовать Query(xxxx) = ...из Запись приведет к ошибкам,Этот способ письма происходит от FastAPI Документы с официального сайта:

использоватьellipsisнастраивать必填параметр

错误из文档示例
错误из文档示例

关于此неправильный способ написания Автор предоставил FastAPI Упомянул Issue:https://github.com/fastapi/fastapi/issues/12313

Связанный ответ разработчика
Связанный ответ разработчика
правильный способ написания
Язык кода:python
кодКоличество запусков:0
копировать
@app.get("/validation5")
async def async_root5(str_param: Annotated[str, Query(default = ...,
                                                      min_length = 3,
                                                      max_length = 20,
                                                      pattern = '^[a-zA-Z0-9]+$',
                                                      description = 'This is a string parameter')]):
    """
    использовать Query(default = ...) из Способнастраивать str_list требуетсяпараметр
    Нетиспользовать default 时параметр也会по умолчаниютребуется
    Remember that in most of the cases, when something is required,
    you can simply omit the default, so you normally don't have to use ...
    """
    ret = {"str_list": str_param}
    h = hashlib.sha3_512(str_param.encode('utf-8')).hexdigest()
    ret.update({"sha3_512": h})
    ret.update({"uuid": uuid.uuid4().hex})
    return ret
Использовать многоточие по умолчаниюустановить необходимые атрибуты
Использовать многоточие по умолчаниюустановить необходимые атрибуты

Описание ошибки в официальной документации сайта о том, что обязательные параметры отсутствуют.

Ссылка на описание документа на официальном сайте

Если параметртребуется同时还可以для None из Описание ошибки
Если параметртребуется同时还可以для None из Описание ошибки

Об этом вопросе также Упомянул Issue давать FastAPI команда:Question about "Required, can be None"

проблема получена FastAPI Разработчикиз确认
проблема получена FastAPI Разработчикиз确认

关于这个问题изветка обсуждения:Discussion,заинтересованныйиз Вы можете проверить это сами。

Проблемы, вызванные аннотациями и запросами (по умолчанию = xxxx)

Язык кода:python
кодКоличество запусков:0
копировать
@app.get("/validation1_1")
async def async_root1_1(str_param: Annotated[str | None, Query(default = 'test',
                                                               min_length = 3,
                                                               max_length = 20,
                                                               pattern = '^[a-zA-Z0-9]+$',
                                                               description = 'This is a string parameter')]):
    ret = {"str_list": str_param}
    if str_param is not None:
        h = hashlib.sha3_512(str_param.encode('utf-8')).hexdigest()
        ret.update({"sha3_512": h})
    else:
        ret.update({"uuid": uuid.uuid4().hex})
    return ret
использовать  Query из default параметрнастраиватьпо умолчаниюценить
использовать Query из default параметрнастраиватьпо умолчаниюценить

При запуске будет сообщено об ошибке:

Язык кода:shell
копировать
AssertionError: `Query` default value cannot be set in `Annotated` for 'str_param'. Set the default value with `=` instead.
Amazon Q AI данныйиз答复
Amazon Q AI данныйиз答复

总之在использовать Аннотированное словосочетание Query Вам необходимо обратить внимание на детали кодирования.

Получение списка параметров запроса

Язык кода:python
кодКоличество запусков:0
копировать
@app.get("/validation7")
async def async_root7(str_list: Annotated[List[str] | None, Query(min_length = 1)]):
    """
    Получение списка параметров запроса
    curl -X 'GET' 'http://127.0.0.1:18081/validation7?str_list=aaa&str_list=bbb&str_list=ccc' -H 'accept: application/json'
    """
    if str_list is not None:
        return {'items_count': len(str_list), 'items': str_list}
    else:
        return {'message': 'no items'}
Эффект операции
Эффект операции

На что следует обратить внимание при использовании псевдонима для параметров пути

Язык кода:python
кодКоличество запусков:0
копировать
@app.get('/{item_id}')
async def async_root(item_id: Annotated[int, Path(title = 'Item ID', alias = 'xid')]):
    """
    GithubIssue: https://github.com/fastapi/fastapi/issues/12323
    когда с alias Интерфейс не работает должным образом, если:
        curl http://127.0.0.1:18081/123
        {"detail":[{"type":"missing","loc":["path","xid"],"msg":"Field required","input":null}]}
    """
    return {'item_id': item_id}

@app.get('/{xid_2}')
async def async_root2(item_id: Annotated[int, Path(title = 'Item ID', alias = 'xid_2')]):
    """
    The title parameter you're referring to in the Path function is part of FastAPI's path parameter customization. While it doesn't directly appear in the Swagger UI documentation, it serves an important purpose in the OpenAPI schema.
    Here's what the title parameter does:
        OpenAPI Schema: The title is included in the OpenAPI (formerly Swagger) schema that FastAPI generates.
                        This schema is a machine-readable description of your API, which can be used by various tools and clients.
        JSON Schema: In the context of JSON Schema (which OpenAPI uses), the title provides a human-readable name for the parameter.
                     It's meant to be a brief description of the parameter.
        API Documentation: While not directly visible in the Swagger UI,
                           the title can be used by other documentation tools that consume the OpenAPI schema to provide more descriptive names for parameters.
        Code Generation: Tools that generate client code from OpenAPI schemas might use the title to create more meaningful variable or property names.
    """
    return {'item_id': item_id}

Связанный issue ветка обсуждения:Should the alias parameter in the Path method be removed?

Связанныйотвечать
Связанныйотвечать
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose