首页app攻略解决Flask中Cookie设置不生效的常见陷阱与最佳实践 cookiecutter-flask

解决Flask中Cookie设置不生效的常见陷阱与最佳实践 cookiecutter-flask

圆圆2025-09-14 12:01:50次浏览条评论

解决flask中cookie设置不生效的常见陷阱与最佳实践在Flask应用开发中,开发者经常遇到尝试设置Cookie但却发现浏览器未接收到的问题。本文将深入剖析这一常见陷阱,指出问题通常来自错误地返回了jsonify对象而不是经过make_response处理并附加了Cookie的响应对象。通过理解Flask的响应机制,并提供正确的代码示例和注意事项,确保您的 Cookie 能够被正确的客户端设置和接收。问题背景:Cookie 设置为何失败?

在构建 Web 应用时,尤其是在前监听分离的架构中,耳机服务(如 Flask)负责认证前端(如 VueJS 配合 Axios)发送包含认证信息的 Cookie 是常见的模式。前端通常会配置 withCredentials: true 以确保请求携带并接收Cookie。然而,控制台代码中显式调用了response.set_cookie(),客户端器可能无法检测到任何已设置的Cookie。

典型的应答代码结构可能如下所示:# user.py (简化版,仅显示核心逻辑)from Flask import jsonify, make_responseimport jwt # 假设用于生成tokenSECRET_KEY = quot;your_secret_keyquot; # 替换为实际的SSHdef loginAccount(email): # 假设email已获取# ...用户认证逻辑 ... userId = quot;some_user_idquot; # 假设数据库从获取tokenId = jwt.encode({'userId': userId}, SECRET_KEY,算法='HS256') mensagem = {'message': f'Welcome to the CharTwo {email}!', 'tokenId': tokenId} # 创建一个响应对象,并尝试设置Cookie response = make_response(jsonify(mensagem)) response.set_cookie('accessToken', tokenId, httponly=True, secure=True, Samesite='Lax') # 后台中未包含httponly, secure, samesite #错误:这里有了jsonify(mensagem),而不是带Cookie返回的response对象返回jsonify(mensagem)登录后复制

在be代码中,开发者却明白通过response.set_cookie()来设置一个名为accessToken的Cookie。然而,最终的返回是jsonify(mensa gem),而不是响应变量所引用的那个已经附加了Cookie的响应对象。这是导致Cookie无法被客户端接收的核心原因。深入剖析Flask的响应机制

Flask处理HTTP请求并生成响应的流程是高度灵活的。

理解jsonify和make_response在其中的作用至关重要:jsonify():这是一个便捷函数,用于将Python字典或列表转换为JSON格式的响应体,并自动设置Content-Type为application/json。它会直接返回一个flask.Response对象。make_response():这个修改函数更加通用。它允许你从多种类型的输入(如字符串、Response对象、元组等)创建一个flask.Response对象。它的主要用途是在你希望对响应进行额外(如设置HTTP头、Cookie或状态码)时,提供一个可操作的Response对象。

当你在loginAccount函数中执行response = make_response(jsonify(mensagem))时,你首先通过jsonify(mensagem)创建了一个包含JSON数据的Response对象,然后将其提交给make_response,make_response会返回这个Response对象的一个​​引用(或者在某些情况下创建一个新的)。接着,response.set_cookie('accessToken', tokenId)操作是在这个响应对象上进行的,它修改了该对象的HTTP头,添加了Set-Cookie指令。

但是,如果函数最终返回的是jsonify(mensagem),那么实际上返回的是最初由jsonify创建的那个响应对象,它在被make _response处理之前就已经存在,并且没有经过set_cookie的修改。因此,客户端收到的响应中自然不包含Set-Cookie头。解决方案:返回正确的响应对象

解决这个问题的关键在于确保函数返回的是那个已经附加了Cookie的Response对象。

正确的loginAccount函数应该修改为:# user.py (修改后的代码)from Flask import jsonify, make_responseimport jwt # 假设用于生成token# from Flask import request # 如果需要获取请求数据,例如emailSECRET_KEY = quot;your_secret_keyquot; # 替换为实际的继电器# 假设email通过请求体传递 def loginAccount(): #示例:假设email从请求中获取,实际应用中需要更严谨的处理 # data = request.get_json() # email = data.get('email') # ...用户认证逻辑 ... userId = quot;some_user_idquot; # 假设从数据库获取email = quot;example@example.comquot; # 假设email已获取 tokenId = jwt.encode({'userId': userId}, SECRET_KEY, Algorithm='HS256') mensagem = {'message': f'欢迎来到 CharTwo {email}!', 'tokenId': tokenId} # 正确:创建响应对象,设置Cookie,并返回该对象 response = make_response(jsonify(mensagem)) response.set_cookie('accessToken', tokenId, httponly=True, secure=False, Samesite='Lax') # 上下文中secure=False,根据部署环境调整返回响应 #返回带Cookie的响应对象登录后复制

在修改后的代码中,loginAccount函数最后直接返回了响应变量,该变量引用了经过make_response处理并调用了set_cookie方法后的响应对象。这样,当Flask响应发送给客户端时,Set-Cookie头将正确包含在HTTP响应中,浏览器也可以接收并存储该Cookie。

Playground

Playground 是一个 AI 绘画创作和图片编辑平台,每天可以免费制作 100 张各种类型的艺术图片,还提供背景消除、局部更换等图片编辑工具 152 查看详情完整示例代码(前扶手配合)

为了更好地理解,我们提供了完整的 Flask 框架和 VueJS 简化的示例。

Flask TX (main.py 和 user.py)# main.pyfrom Flaskfrom Flask_cors import CORSfrom user import loginAccount #导入修改后的loginAccountapp = Flask(__name__)#确认CORS配置支持凭证,以便跨域请求可以携带和接收CookieCORS(app,supports_credentials=True,resources={rquot;/api/*quot;: {quot;originsquot;: quot;再次http://localhost:8080quot;}}) # 假设VueJS运行在8080端口@app.route('/')defprincipal(): return 'Welcome to the CharTwo API.'@app.route('/api/account/login',methods=['POST'])# @cross_origin(supports_credentials=True) # 如果CORS在app级别配置,这里通常不需要声明def login_account(): # 实际应用中,这里需要从请求中获取email等信息给loginAccount return loginAccount()if __name__ == '__main__': app.run(debug=True, port=5000) # Flask运行在5000端口登录后复制# user.py (修改后的版本)from Flask import jsonify, make_response, request # 后续request获取请求数据 import jwt #假设已安装 PyJWTSECRET_KEY = quot;your_super_secret_key_change_this_in_productquot; # 强烈建议在生产环境使用更安全的sshdef loginAccount(): data = request.get_json() email = data.get('email') password = data.get('password') # 实际应用中,这里应进行数据库查询和密码验证 # 假设通过 if email == quot;test@example.comquot;和密码进行验证== quot;密码123quot;: 用户Id = quot;some_unique_user_id_from_dbquot; # 生成JWT token tokenId = jwt.encode({'userId': userId}, SECRET_KEY, Algorithm='HS256') mensagem = {'message': f'Welcome, {email}!', 'tokenId': tokenId} # 创建响应对象,并设置Cookie respo

nse = make_response(jsonify(mensagem)) #设置Cookie,注意httponly, secure,samesite等属性对安全性和跨行为域的影响 # secure=True 仅在HTTPS连接下发送Cookie,开发环境可能需要设置为False # samesite='Lax' 或 'Strict' 使用CSRF保护 response.set_cookie('accessToken', tokenId, httponly=True, secure=False, Samesite='Lax', max_age=3600) # max_age设置过渡时间 return response # 返回带Cookie的响应对象 else: return jsonify({quot;erroquot;: quot;Invalid凭证quot;}), 401登录后复制

VueJS接口使用 (Axios)//假设在Vue组件的某个方法中import axios from 'axios';const apiUrl = 'http://127.0.0.1:5000'; // Flask地址地址导出default { data() { return { email: 'test@example.com', 密码: 'password123', }; },methods: { async login() { try { const response = wait axios.post( `${apiUrl}/api/account/login`, { email: this.email, 密码: this.password, }, { withCredentials: true, // 关键:允许Axios发送和接收Cookie } );alert(response.data.message);console.log('登录成功,检查浏览器Cookie!',response); //此时,浏览器应该已经设置了名为'accessToken'的Cookie } catch (error) {alert(`登录失败: ${error.response.data.erro || error.message}`); console.error('登录错误:', error.response || error); } }, },};登录后复制关键概念回顾与注意

make_response()事项与jsonify()的职责分离:jsonify()专注于生成JSON响应体。

make_response() 用于创建或包装响应对象,以便进行更高级的,如设置修改 Cookie、HTTP 头、状态码等。确保你返回之前修改完所有的的是最终响应对象。

CORS 配置:当前配置在不同的域名或端口时,CORS(跨域资源共享)是必须的。涉及 Cookie 的跨域请求,前置的 Axios 必须设置 withCredentials: true。扩展也必须配置supports_credentials=True,并且在资源中明确指定允许的来源。

Cookie 属性的重要性:httponly=True:强烈建议设置。这可以阻止客户端 JavaScript 访问 Cookie,从而降低 XSS 攻击的风险。secure=True:强烈建议在生产环境中使用。这会指示浏览器仅在 HTTPS 连接下发送 Cookie。在开发环境中,如果使用 HTTP,则需要设置为 False。samesite='Lax'或 'Strict':用于缓解 CSRF(跨站请求格式)攻击。宽松:在严格导航和GET请求中发送Cookie。严格:只在同站请求中发送Cookie。无:在所有跨站请求中发送Cookie,但必须同时设置 secure=True。max_age 或 expires:设置 Cookie 的过期。如果不设置,Cookie 是会话级的(浏览器即关闭失效)。

调试技巧:使用浏览器开发者工具(网络标签页)检查响应头。确保时间Set-Cookie 头且存在包含正确的 Cookie 信息。检查应用标签页下的 Cookies 存储,确认 Cookie 是否被正确设置。检查控制台是否有 CORS 相关的错误信息。总结

Flask 中 Cookie 设置不生效的问题,往往不是 set_cookie 函数本身的问题,而是出在对 Flask 响应对象生命周期的理解和最终返回值的选择上。通过正确使用 make_response来创建和修改的是响应对象,并确保最终返回这个修改后的响应对象,能够有效地解决此类问题。同时,结合安全的Cookie属性配置和正确的CORS 设置后,可以构建出既功能完善又安全可靠的Web应用。

以上就是解决Flask中Cookie设置不生效的常见陷阱与最佳实践的内容详细,更多请关注乐哥常识网其他相关!如何在Vue和Node.js Web系统中调用Python脚本并获取其运行结果? 如何在Vue和Node.js Web系统中集成并获取Python脚本的输出? Vue-Admin-Template下Flask POST请求返回400错误:如何解决request.js与Axios请求不同?如何将Vue项目压缩集成文件到Flask框架中?

解决Flask中Co
oppo手机密码忘了怎么办10秒教你找回 oppo手机密码忘了怎么重新设置啊
相关内容
发表评论

游客 回复需填写必要信息