本文目录导读:

在Python中设置Cookie时效主要取决于你使用的Web框架,以下是几种常见场景的实现方法:
Flask框架
from flask import Flask, make_response, request
app = Flask(__name__)
@app.route('/set_cookie')
def set_cookie():
resp = make_response('Cookie 已设置')
# 设置Cookie,过期时间为1小时
resp.set_cookie(
'username',
'john_doe',
max_age=3600, # 秒为单位,1小时
expires=None, # 也可以使用datetime对象
path='/',
domain=None,
secure=False,
httponly=False
)
# 使用expires参数设置具体过期时间
# from datetime import datetime, timedelta
# expire_time = datetime.utcnow() + timedelta(hours=2)
# resp.set_cookie('token', 'abc123', expires=expire_time)
return resp
@app.route('/delete_cookie')
def delete_cookie():
resp = make_response('Cookie 已删除')
# 删除Cookie(设置过期时间为过去)
resp.set_cookie('username', '', expires=0)
return resp
if __name__ == '__main__':
app.run()
Django框架
from django.http import HttpResponse
from datetime import datetime, timedelta
def set_cookie_view(request):
response = HttpResponse("Cookie 已设置")
# 方法1:使用max_age(秒)
response.set_cookie(
'user_id',
'12345',
max_age=3600, # 1小时
path='/',
domain=None,
secure=None,
httponly=False,
samesite='Lax'
)
# 方法2:使用expires(datetime对象)
expire_time = datetime.utcnow() + timedelta(days=7)
response.set_cookie(
'session_token',
'abcdef',
expires=expire_time
)
# 设置永不过期(实际不会,但可设置很大值)
# max_age=31536000 # 1年
return response
def delete_cookie_view(request):
response = HttpResponse("Cookie 已删除")
response.delete_cookie('user_id', path='/')
return response
使用http.cookiejar(不依赖框架)
from http.cookies import SimpleCookie
from datetime import datetime, timedelta
# 创建Cookie
cookie = SimpleCookie()
cookie['username'] = 'john_doe'
# 设置过期时间
expire_time = datetime.utcnow() + timedelta(hours=2)
cookie['username']['expires'] = expire_time.strftime("%a, %d %b %Y %H:%M:%S GMT")
cookie['username']['max-age'] = 7200 # 2小时
cookie['username']['path'] = '/'
cookie['username']['domain'] = 'example.com'
# 输出Cookie头
print(cookie.output())
# 输出: Set-Cookie: username=john_doe; Domain=example.com; Path=/; Max-Age=7200; expires=...
# 解析Cookie
cookie_str = "session=abc123; expires=Thu, 01 Jan 2025 00:00:00 GMT"
parsed_cookie = SimpleCookie(cookie_str)
print(parsed_cookie['session'].value) # abc123
使用requests库(客户端)
import requests
from http.cookies import SimpleCookie
# 自定义会话并设置Cookie
session = requests.Session()
# 方式1:通过headers设置
session.headers.update({
'Cookie': 'username=john_doe; session=abc123'
})
# 方式2:直接设置Cookie
cookie = SimpleCookie()
cookie['session_id'] = 'xyz789'
cookie['session_id']['expires'] = 'Thu, 01 Jan 2025 00:00:00 GMT'
session.cookies.update(cookie)
# 发送请求
response = session.get('https://example.com')
# 手动处理服务器返回的Cookie(包含过期时间)
for cookie in session.cookies:
print(f"{cookie.name}: {cookie.value}")
print(f" 过期时间: {cookie.expires}") # 时间戳或None
Cookie时效设置关键参数
| 参数 | 说明 | 示例 |
|---|---|---|
max_age |
相对过期时间(秒) | max_age=3600(1小时) |
expires |
绝对过期时间(datetime对象) | expires=datetime(2025,1,1) |
-1 或 0 |
表示删除cookie | max_age=0 或 expires=0 |
重要注意事项
- 时间格式:
expires参数在HTTP头中应该是GMT格式 - 相对 vs 绝对:推荐使用
max_age(相对时间),更精确 - 浏览器支持:部分旧浏览器不支持
max-age,因此可以同时设置max_age和expires - 会话Cookie:如果不设置过期时间,Cookie会在浏览器关闭时删除
- 安全考虑:敏感Cookie应设置
HttpOnly和Secure标志
完整示例(综合应用)
from flask import Flask, make_response, request
from datetime import datetime, timedelta
app = Flask(__name__)
@app.route('/login')
def login():
# 模拟用户登录
username = request.args.get('username', 'guest')
resp = make_response(f'欢迎 {username}')
# 设置认证Cookie(7天过期)
expire_time = datetime.utcnow() + timedelta(days=7)
resp.set_cookie(
'auth_token',
'secure_token_123',
expires=expire_time,
max_age=7*24*3600, # 7天
httponly=True, # 只允许HTTP访问
secure=False, # 生产环境应设置为True(HTTPS)
samesite='Lax' # 防止CSRF攻击
)
# 设置普通Cookie(1小时过期)
resp.set_cookie(
'preferences',
'dark_mode=true',
max_age=3600,
path='/'
)
# 设置临时Cookie(会话结束即删除)
resp.set_cookie('session_id', 'temp_session', max_age=None)
return resp
if __name__ == '__main__':
app.run(debug=True)
选择哪种方式取决于你的具体应用场景和使用的Web框架,核心是理解max_age和expires的区别,以及如何正确设置Cookie的过期时间。