Отправка статусных кодов

Последнее обновление: 06.09.2022

Одной из расспространненых задач в веб-приложении является отправка статусных кодов, которые указывают на статус выполнения операции на сервере.

  • 1xx: предназначены для информации. Ответ с таким кодом не может иметь содержимого

  • 2xx: указывает на успешноее выполнение операции

  • 3xx: предназначены для переадресации

  • 4xx: предназначены для отправки информации об ошибок клиента

  • 5xx: предназначены для информации об ошибках сервера

По умолчанию функции обработки отправляют статусный код 200, но при необходимости мы можем отправить любой статусный код. Для этого у методов get(), post(), put(), delete(), options(), head(), patch(), trace() в классе FastAPI применяется параметр status_code, который принимает числовой код статуса HTTP. Например:

.
from fastapi import FastAPI

app = FastAPI()

@app.get("/notfound", status_code=404)
def notfound():
    return  {"message": "Resource Not Found"}

В данном случае при обращении по пути "/notfound" клиенту отправляется статусный код ошибки 404, который говорит о том, что ресурс не найден.

Отправка статусных кодов в FastAPI и Python

Для упрощения в FastAPI есть модуль status, в котором определены константы для представления статусных кодов:

  • HTTP_100_CONTINUE (код 100)

  • HTTP_101_SWITCHING_PROTOCOLS (код 101)

  • HTTP_102_PROCESSING (код 102)

  • HTTP_103_EARLY_HINTS (код 103)

  • HTTP_200_OK (код 200)

  • HTTP_201_CREATED (код 201)

  • HTTP_202_ACCEPTED (код 202)

  • HTTP_203_NON_AUTHORITATIVE_INFORMATION (код 203)

  • HTTP_204_NO_CONTENT (код 204)

  • HTTP_205_RESET_CONTENT (код 205)

  • HTTP_206_PARTIAL_CONTENT (код 206)

  • HTTP_207_MULTI_STATUS (код 207)

  • HTTP_208_ALREADY_REPORTED (код 208)

  • HTTP_226_IM_USED (код 226)

  • HTTP_300_MULTIPLE_CHOICES (код 300)

  • HTTP_301_MOVED_PERMANENTLY (код 301)

  • HTTP_302_FOUND (код 302)

  • HTTP_303_SEE_OTHER (код 303)

  • HTTP_304_NOT_MODIFIED (код 304)

  • HTTP_305_USE_PROXY (код 305)

  • HTTP_306_RESERVED (код 306)

  • HTTP_307_TEMPORARY_REDIRECT (код 307)

  • HTTP_308_PERMANENT_REDIRECT (код 308)

  • HTTP_400_BAD_REQUEST (код 400)

  • HTTP_401_UNAUTHORIZED (код 401)

  • HTTP_402_PAYMENT_REQUIRED (код 402)

  • HTTP_403_FORBIDDEN (код 403)

  • HTTP_404_NOT_FOUND (код 404)

  • HTTP_405_METHOD_NOT_ALLOWED (код 405)

  • HTTP_406_NOT_ACCEPTABLE (код 406)

  • HTTP_407_PROXY_AUTHENTICATION_REQUIRED (код 407)

  • HTTP_408_REQUEST_TIMEOUT (код 408)

  • HTTP_409_CONFLICT (код 409)

  • HTTP_410_GONE (код 410)

  • HTTP_411_LENGTH_REQUIRED (код 411)

  • HTTP_412_PRECONDITION_FAILED (код 412)

  • HTTP_413_REQUEST_ENTITY_TOO_LARGE (код 413)

  • HTTP_414_REQUEST_URI_TOO_LONG (код 414)

  • HTTP_415_UNSUPPORTED_MEDIA_TYPE (код 415)

  • HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE (код 416)

  • HTTP_417_EXPECTATION_FAILED (код 417)

  • HTTP_418_IM_A_TEAPOT (код 418)

  • HTTP_421_MISDIRECTED_REQUEST (код 421)

  • HTTP_422_UNPROCESSABLE_ENTITY (код 422)

  • HTTP_423_LOCKED (код 423)

  • HTTP_424_FAILED_DEPENDENCY (код 424)

  • HTTP_425_TOO_EARLY (код 425)

  • HTTP_426_UPGRADE_REQUIRED (код 426)

  • HTTP_428_PRECONDITION_REQUIRED (код 428)

  • HTTP_429_TOO_MANY_REQUESTS (код 429)

  • HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE (код 431)

  • HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS (код 451)

  • HTTP_500_INTERNAL_SERVER_ERROR (код 500)

  • HTTP_501_NOT_IMPLEMENTED (код 501)

  • HTTP_502_BAD_GATEWAY (код 502)

  • HTTP_503_SERVICE_UNAVAILABLE (код 503)

  • HTTP_504_GATEWAY_TIMEOUT (код 504)

  • HTTP_505_HTTP_VERSION_NOT_SUPPORTED (код 505)

  • HTTP_506_VARIANT_ALSO_NEGOTIATES (код 506)

  • HTTP_507_INSUFFICIENT_STORAGE (код 507)

  • HTTP_508_LOOP_DETECTED (код 508)

  • HTTP_510_NOT_EXTENDED (код 510)

  • HTTP_511_NETWORK_AUTHENTICATION_REQUIRED (код 511)

Пример использования

from fastapi import FastAPI, status

app = FastAPI()

@app.get("/notfound", status_code=status.HTTP_404_NOT_FOUND)
def notfound():
    return  {"message": "Resource Not Found"}

Определение статусного кода в ответе

В примере выше функция вне зависимости от данных запроса или каких-то других условий в любом случае возвращала статусный код 404. Однако чаще бывает необходимо возвращать статусный код в зависимости от некоторых условий. В этом случае мы можем использовать параметр status_code конструктора класса Response или его наследников:

from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/notfound")
def notfound():
    return JSONResponse(content={"message": "Resource Not Found"}, status_code=404)

Изменение статусного кода

Можно комбинировать оба подхода:

from fastapi import FastAPI, Response, Path

app = FastAPI()

@app.get("/users/{id}", status_code=200)
def users(response: Response, id: int = Path()):
    if id < 1:
        response.status_code = 400
        return {"message": "Incorrect Data"}
    return  {"message": f"Id = {id}"}

В данном случае если параметр пути меньше 1, то условно считаем, что переданные некорректные данные, и отправляем в ответ статусный код 400 (Bad Request)

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850