7.1 Cookie 操作
Flask Cookie 操作指南:设置、读取、删除与安全配置
本教程详细讲解Flask中Cookie的设置、读取和删除操作,包括有效期、域名与路径配置,并提供安全注意事项如敏感数据加密,适合新手学习。
推荐工具
Flask Cookie 操作全面指南
什么是Cookie?
Cookie是存储在用户浏览器中的小型文本数据,用于在Web请求之间保持状态,例如用户登录信息或偏好设置。在Flask中,Cookie操作简单直观,适用于管理会话和个性化体验。
设置Cookie
在Flask中,使用response.set_cookie()方法设置Cookie。这个方法允许配置Cookie的名称、值和其他属性,如有效期、域名和路径。
基本语法
from flask import Flask, make_response
app = Flask(__name__)
@app.route('/set_cookie')
def set_cookie():
resp = make_response("Cookie已设置")
resp.set_cookie('username', 'john_doe')
return resp
高级配置
- 有效期: 使用
max_age(秒)或expires(datetime对象)控制Cookie的存活时间。 - 域名: 通过
domain参数指定Cookie有效的域名,默认为当前域名。 - 路径: 使用
path参数指定Cookie有效的路径,默认为'/'。 - 安全标志: 设置
secure=True确保Cookie仅通过HTTPS传输。 - HttpOnly标志: 设置
httponly=True防止JavaScript访问,增强安全性。
示例代码
@app.route('/set_cookie_with_config')
def set_cookie_with_config():
resp = make_response("Cookie已设置并配置属性")
resp.set_cookie(
'user_id',
'12345',
max_age=3600, # 有效期1小时
domain='example.com',
path='/home',
secure=True,
httponly=True
)
return resp
读取Cookie
从Flask请求中读取Cookie使用request.cookies字典,这是一个类似字典的对象,包含所有发送到服务器的Cookie。
代码示例
from flask import Flask, request
app = Flask(__name__)
@app.route('/read_cookie')
def read_cookie():
username = request.cookies.get('username', '未设置')
return f"用户名: {username}"
- 提示: 使用
.get()方法避免KeyError,提供默认值。
删除Cookie
删除Cookie通过设置一个已过期的Cookie来实现,可以设置max_age=0或expires为过去的时间。
代码示例
@app.route('/delete_cookie')
def delete_cookie():
resp = make_response("Cookie已删除")
resp.set_cookie('username', '', max_age=0)
return resp
Cookie有效期、域名与路径配置详解
- 有效期: 使用
max_age指定Cookie在浏览器中的存活时间(秒)。例如,max_age=86400表示Cookie有效一天。expires参数接受datetime对象,但max_age更常用。 - 域名: 默认情况下,Cookie仅在设置它的域名下有效。通过
domain参数可以限制Cookie到特定子域名,例如domain='.example.com'允许所有子域名访问。 - 路径:
path参数定义Cookie在服务器上的有效路径。例如,path='/admin'仅当用户访问以/admin开头的页面时,Cookie才被发送。
配置示例
# 设置Cookie,有效期1天,仅在example.com及其子域名下有效,路径为/dashboard
resp.set_cookie('session', 'abc123', max_age=86400, domain='.example.com', path='/dashboard')
Cookie的安全注意事项
处理Cookie时,安全是关键。以下是重要的安全最佳实践:
- 加密敏感数据: 不要在Cookie中存储明文敏感信息(如密码、信用卡号)。使用加密库如
itsdangerous或cryptography进行加密。 - 使用HTTPS: 在传输敏感Cookie时,设置
secure=True确保Cookie仅通过HTTPS发送,防止中间人攻击。 - 设置HttpOnly标志: 通过
httponly=True防止跨站脚本攻击(XSS),确保Cookie不能通过JavaScript访问。 - SameSite属性: 虽然Flask的
set_cookie()默认不设置SameSite,但现代浏览器支持它。可以通过添加SameSite='Lax'或Strict'来防止跨站请求伪造(CSRF)。 - 定期更换会话ID: 如果使用Cookie管理会话,定期生成新的会话ID以减少会话劫持风险。
加密示例(使用itsdangerous)
from itsdangerous import TimedSerializer
from flask import Flask, make_response
app = Flask(__name__)
app.secret_key = 'your-secret-key' # 设置安全密钥
def encrypt_data(data):
s = TimedSerializer(app.secret_key)
return s.dumps(data)
def decrypt_data(token):
s = TimedSerializer(app.secret_key)
return s.loads(token)
@app.route('/set_secure_cookie')
def set_secure_cookie():
sensitive_data = {'user_id': 1001, 'role': 'admin'}
encrypted_token = encrypt_data(sensitive_data)
resp = make_response("安全Cookie已设置")
resp.set_cookie('secure_data', encrypted_token, httponly=True, secure=True)
return resp
@app.route('/read_secure_cookie')
def read_secure_cookie():
token = request.cookies.get('secure_data')
if token:
data = decrypt_data(token)
return f"解密数据: {data}"
return "未找到安全Cookie"
完整示例:综合操作Cookie
以下是一个Flask应用示例,展示设置、读取、删除Cookie的完整流程。
from flask import Flask, request, make_response
from datetime import datetime, timedelta
app = Flask(__name__)
@app.route('/')
def index():
return "欢迎使用Flask Cookie示例"
@app.route('/set')
def set():
resp = make_response("设置了一个新Cookie")
resp.set_cookie('last_visit', datetime.now().isoformat(), max_age=300, httponly=True) # 5分钟有效期
return resp
@app.route('/read')
def read():
last_visit = request.cookies.get('last_visit', '从未访问')
return f"上次访问时间: {last_visit}"
@app.route('/delete')
def delete():
resp = make_response("Cookie已删除")
resp.set_cookie('last_visit', '', max_age=0)
return resp
if __name__ == '__main__':
app.run(debug=True)
总结
本教程涵盖了Flask中Cookie的基础操作,包括设置、读取和删除,并详细解释了有效期、域名与路径配置。安全方面,强调了加密敏感数据、使用HTTPS和设置安全标志的重要性。通过实践示例,新手可以快速上手Flask Cookie管理。记住,总是优先考虑安全,遵循最佳实践来保护用户数据。
进一步学习
- 探索Flask的
session模块,它基于Cookie提供了更高级的会话管理。 - 阅读Flask官方文档以获取更多API细节和更新。
- 实践在真实项目中应用这些概念,例如构建用户登录系统。
开发工具推荐