Python案例如何设置Cookie时效?

wen python案例 16

本文目录导读:

Python案例如何设置Cookie时效?

  1. Flask框架
  2. Django框架
  3. 使用http.cookiejar(不依赖框架)
  4. 使用requests库(客户端)
  5. Cookie时效设置关键参数
  6. 重要注意事项
  7. 完整示例(综合应用)

在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)
-10 表示删除cookie max_age=0expires=0

重要注意事项

  1. 时间格式expires参数在HTTP头中应该是GMT格式
  2. 相对 vs 绝对:推荐使用max_age(相对时间),更精确
  3. 浏览器支持:部分旧浏览器不支持max-age,因此可以同时设置max_ageexpires
  4. 会话Cookie:如果不设置过期时间,Cookie会在浏览器关闭时删除
  5. 安全考虑:敏感Cookie应设置HttpOnlySecure标志

完整示例(综合应用)

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_ageexpires的区别,以及如何正确设置Cookie的过期时间。

抱歉,评论功能暂时关闭!