调用FastAPI接口时Cookie无法创建的问题求助
问题分析与解决方案
核心错误原因
- 请求发起方错误:你前端代码中用
requests.get调用后端接口,这是前端服务(服务器端)发起的HTTP请求,并非用户浏览器发起的请求。后端设置的Cookie会被requests库的会话保存,不会传递到用户的浏览器中。 - 内部请求无效:后端
/keycloak_code接口里调用/set接口,属于后端服务自身发起的内部请求,Cookie是设置给这个内部请求的响应,和用户浏览器完全无关,自然不会在浏览器中创建Cookie。
修复方案
方案1:直接在/keycloak_code响应中设置Cookie
无需额外调用/set接口,直接在处理keycloak_code的接口里,给返回给浏览器的响应设置Cookie:
# 后端代码修改 @app.get("/keycloak_code") def get_tokens(response: Response, data: dict): code = data['code'] print(code) # 直接在此处为浏览器响应设置Cookie response.set_cookie(key='tokic3', value='helloworld', httponly=True) return True
方案2:前端让浏览器直接发起请求
前端不要用requests转发请求,而是返回HTML页面,让浏览器直接请求后端接口:
# 前端代码修改 @app.get('/') async def homepage(request: Request, response_class=HTMLResponse): return HTMLResponse(""" <script> // 浏览器直接发起请求到后端接口,携带凭证信息 fetch('http://local.me.me:8002/set', {method: 'GET', credentials: 'include'}) .then(() => alert('Cookie已设置')); </script> <p>正在设置Cookie...</p> """)
关键注意事项
- 确保前后端主域名一致(
local.me.me),端口差异不影响Cookie设置;若显式设置domain参数,需匹配主域名(如domain='.me.me')。 - 跨端口请求时,前端JS请求需带上
credentials: 'include',确保浏览器自动处理Cookie。
内容的提问来源于stack exchange,提问作者Ronald
相关产品推荐
相关产品推荐

