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