Flask Cookies 操作详解|Flask如何读取和设置写入Cookies

如何在 Flask 中读取、设置和删除 Cookies(附代码示例)

文章目录

Cookies 是在客户端存储数据、维护用户状态的重要方式。作为一个轻量级且广泛使用的 Python Web 框架,Flask 提供了简单高效的 API 来处理 Cookies。这篇文章将从读取、写入、删除到 Cookies 安全性设置方面,全面解析在 Flask 中的 Cookies 操作,为开发者提供参考指南。

在 Flask 中读取 Cookies 数据

在 Flask 中,可以通过 request 对象的 cookies 属性来读取用户的 Cookie。这是一个包含所有 Cookie 名称和值的字典,通过字典的 .get() 方法,可以直接访问到特定 Cookie 的值。例如,获取 username Cookie 值的代码如下:

from flask import request

@app.route('/')
def index():
    username = request.cookies.get('username')
    return f'Hello, {username}'

以上代码中的 cookies.get() 方法确保在 Cookie 不存在的情况下返回 None,避免潜在的报错。

在 Flask 中设置 Cookies

设置 Cookie 可以通过 make_response 函数来实现。使用 make_response 创建响应对象,然后调用该对象的 set_cookie 方法设置 Cookie 值。例如,用户登录时可以将用户名保存在 username Cookie 中:

from flask import make_response

@app.route('/login', methods=['POST'])
def login():
    # 省略验证用户登录代码
    resp = make_response('登录成功')
    resp.set_cookie('username', 'axiaoxin')
    return resp

在此代码中,make_response 函数创建了一个响应对象 resp,并通过 set_cookie 将 Cookie 键名设为 username,值为 axiaoxin

Flask 设置 Cookies 过期时间和其他选项

Flask 支持多种 Cookie 设置选项,包括过期时间、路径、域、secure 标记、httponly 标记等。以下示例设置 Cookie 有效期为 90 天:

from datetime import datetime, timedelta

@app.route('/')
def index():
    resp = make_response('Cookie set with options!')
    expire_date = datetime.now() + timedelta(days=90)  # 设置过期时间为90天后
    resp.set_cookie('username', 'axiaoxin', expires=expire_date, path='/')
    return resp

对于需要更高安全性的场景,Flask 提供 securehttponly 标记,限制 Cookie 只能通过 HTTPS 传输,并防止 JavaScript 访问:

resp.set_cookie('username', 'axiaoxin', secure=True, httponly=True)

Flask Cookies 设置选项的详细解读

Flask 的 set_cookie 方法提供多种参数,以确保 Cookies 在功能和安全性上满足不同需求。其完整的参数签名如下:

set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)
  • key (str): Cookie 的名称。
  • value (str): Cookie 的值。
  • max_age (timedelta | int | None): Cookie 的最大存活时间(秒)。
  • expires (str | datetime | int | float | None): 指定过期时间,可以是 datetime 对象或 UNIX 时间戳。
  • path (str | None): 限制 Cookie 的生效路径。默认适用于整个域。
  • domain (str | None): 跨子域共享 Cookie 时使用。
  • secure (bool): 设为 True 时,Cookie 仅通过 HTTPS 传输。
  • httponly (bool): 设为 True 时,Cookie 不能被 JavaScript 访问,提升安全性。
  • samesite (str | None): 限制 Cookie 仅附加到同站请求上,有助于防止跨站请求伪造攻击(CSRF)。

特别要注意的是,Cookie 的数据大小应保持在服务器允许的最大范围之内,避免超过 max_cookie_size 限制,否则可能引发数据传输问题。

Flask 删除 Cookies

在用户登出或其他特定情况下,可能需要删除已设置的 Cookie。可以使用 set_cookie 方法将 Cookie 的过期时间设置为过去,以清除该 Cookie:

@app.route('/logout')
def logout():
    resp = make_response('Logged out!')
    resp.set_cookie('username', '', expires=0)
    return resp

通过将 expires 设置为 0,可以有效删除 username Cookie。

  • Secure Cookies: 在涉及敏感数据时,设置 secure=True 确保 Cookie 只能通过 HTTPS 传输。
  • HttpOnly Cookies: 通过 httponly=True 阻止 JavaScript 访问,防范 XSS 攻击。
  • SameSite Cookies: 使用 samesite 标志减少 CSRF 攻击风险,推荐将其设为 'Strict''Lax'

Q1: 如何在不同子域之间共享 Cookie? A: 使用 domain 参数指定共享的域,例如 domain=".example.com",让 www.example.comapp.example.com 均可访问。

Q2: 设置 Cookie 的最大大小是多少? A: 一般来说,单个 Cookie 不应超过 4KB,否则可能会引发浏览器兼容性问题和服务器性能问题。

Q3: 如何清除特定路径或域的 Cookie? A: 使用 set_cookie 时明确设置 pathdomain 参数,并将 expires 设置为 0。确保路径和域匹配到需要删除的 Cookie 位置。

总结

通过 Flask 提供的简洁 API,可以方便地实现 Cookie 的读取、设置和删除功能。Cookies 是 Web 应用中重要的状态管理工具,合理的使用 Cookies 不仅能改善用户体验,还能增强系统的安全性。使用 Flask 开发时,应结合 securehttponlysamesite 等安全选项,以构建更可靠的应用。


也可以看看