本文目录导读:

在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的过期时间。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播