Одной из расспространненых задач в веб-приложении является отправка статусных кодов, которые указывают на статус выполнения операции на сервере.
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 есть модуль 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)