1

I am using Python FastAPI and Jinja2, all of which I am new to. I am able to set cookies on their own, or return html templates on their own, but I cannot work out how to do both at once.

Setting cookies only works as expected, but returning a template seems to overwrite that and just returns html with no cookies.

@app.get("/oauth/auth", response_class=HTMLResponse)
async def login_page(request: Request, response: Response):
    client_Code_Req_Schema = ClientCodeReqSchema(client_id=request.query_params.get("client_id"), redirect_uri=request.query_params.get("redirect_uri"), response_type=request.query_params.get("response_type"))
    if check_client(client_Code_Req_Schema):      
        response.set_cookie(key="redirect_uri", value="test")
        return templates.TemplateResponse("authorise.html", {"request": request})
    else:
        raise HTTPException(status_code=400, detail="Invalid request")

Many thanks for any advice. Happy to provide more info if I missed something.

Chris
  • 18,724
  • 6
  • 46
  • 80
arcanespud
  • 13
  • 2

1 Answers1

1

You should set the cookie on the TemplateResponse that is returned from that endpoint, not the Response object defined in the endpoint's parameters, which could be used when returing a simple (JSON) message, e.g., return {'msg': 'OK'}.

Related answers that you might find helpful can be found here, here and here.

Example

@app.get("/oauth/auth", response_class=HTMLResponse)
async def login_page(request: Request):
    if ...     
        response = templates.TemplateResponse("authorise.html", {"request": request})
        response.set_cookie(key="redirect_uri", value="test")
        return response
    else:
        raise HTTPException(status_code=400, detail="Invalid request")
Chris
  • 18,724
  • 6
  • 46
  • 80