Вы можете объявить параметр типа Response в вашей функции эндпоинта.
Затем установить cookies в этом временном объекте ответа.
fromfastapiimportFastAPI,Responseapp=FastAPI()@app.post("/cookie-and-object/")defcreate_cookie(response:Response):response.set_cookie(key="fakesession",value="fake-cookie-session-value")return{"message":"Come to the dark side, we have cookies"}
После этого можно вернуть любой объект, как и раньше (например, dict, объект модели базы данных и так далее).
Если вы указали response_model, он всё равно будет использоваться для фильтрации и преобразования возвращаемого объекта.
FastAPI извлечет cookies (а также заголовки и коды состояния) из временного ответа и включит их в окончательный ответ, содержащий ваше возвращаемое значение, отфильтрованное через response_model.
Вы также можете объявить параметр типа Response в зависимостях и устанавливать cookies (и заголовки) там.
fromfastapiimportFastAPIfromfastapi.responsesimportJSONResponseapp=FastAPI()@app.post("/cookie/")defcreate_cookie():content={"message":"Come to the dark side, we have cookies"}response=JSONResponse(content=content)response.set_cookie(key="fakesession",value="fake-cookie-session-value")returnresponse
Примечание
Имейте в виду, что если вы возвращаете ответ напрямую, вместо использования параметра Response, FastAPI отправит его без дополнительной обработки.
Убедитесь, что ваши данные имеют корректный тип. Например, они должны быть совместимы с JSON, если вы используете JSONResponse.
Также убедитесь, что вы не отправляете данные, которые должны были быть отфильтрованы через response_model.
Вы также можете использовать from starlette.responses import Response или from starlette.responses import JSONResponse.
FastAPI предоставляет fastapi.responses, которые являются теми же объектами, что и starlette.responses, просто для удобства. Однако большинство доступных типов ответов поступает непосредственно из Starlette.
Для установки заголовков и cookies Response используется часто, поэтому FastAPI также предоставляет его через fastapi.responses.