Skip to content

Flask - Cookies

HTTP Cookies(或简称 Cookie)是由网络浏览器存储在客户端计算机上的小段数据。网站使用它们来记住用户在多个请求之间的信息,例如登录状态、偏好设置或购物车中的商品。每次向同一域发送后续请求时,Cookie 都会被发送回服务器。

  • 设置 Cookies: Cookies 设置在 response(响应)对象上。通常,您使用 make_response() 创建一个响应,然后使用 response.set_cookie() 方法来设置 Cookie。
  • 读取 Cookies: 浏览器发送过来的接收到的 Cookies 可在 request.cookies 这个类似字典的对象中获取。
  • Cookie 属性: 除了键和值,您还可以设置其他属性,例如 max_age(以秒为单位的生命周期)、expires(特定的过期日期/时间)、path(URL 路径限制)、domain(域限制)、secure(仅通过 HTTPS 发送)和 httponly(阻止 JavaScript 访问)。

示例:设置和读取 Cookie

让我们创建一个应用,该应用会询问用户的姓名,将其存储在 Cookie 中,然后在用户后续访问时使用存储的姓名问候他们。

  1. 创建 templates/ask_name.html 文件:
<!DOCTYPE html>
<html>
<head><title>Enter Name</title></head>
<body>
<h1>What's your name?</h1>
<form action="{{ url_for('set_user_cookie') }}" method="post">
<p>Name: <input type="text" name="username" required></p>
<p><input type="submit" value="Save Name"></p>
</form>
</body>
</html>
  1. 创建 templates/show_greeting.html 文件:
<!DOCTYPE html>
<html>
<head><title>Greeting</title></head>
<body>
<h1>Hello, {{ user_name_from_cookie }}!</h1>
<p>Your name was remembered using a cookie.</p>
<p><a href="{{ url_for('clear_user_cookie') }}">Forget My Name</a></p>
</body>
</html>
  1. 创建 Flask 应用 (app.py 文件):
from flask import Flask, render_template, request, make_response, redirect, url_for
import datetime
app = Flask(__name__)
@app.route('/')
def index():
# 检查是否存在 username cookie
username = request.cookies.get('username')
if username:
# 如果 cookie 存在,显示问候语
return render_template('show_greeting.html', user_name_from_cookie=username)
else:
# 如果没有 cookie,要求输入姓名
return render_template('ask_name.html')
@app.route('/setcookie', methods=['POST'])
def set_user_cookie():
if request.method == 'POST':
user = request.form['username']
# 基于重定向回 index 页面创建响应对象
response = make_response(redirect(url_for('index')))
# 设置名为 'username' 的 cookie,值为 'user'
# 设置 max_age 以持久化 (例如,1 年)
max_age_seconds = 365 * 24 * 60 * 60
expires_time = datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age_seconds)
response.set_cookie('username', user,
max_age=max_age_seconds,
expires=expires_time,
httpy_only=True, # 推荐:JavaScript 无法访问 Cookie
samesite='Lax') # 推荐:有助于防止 CSRF
return response
# 如果需要,处理非 POST 请求(可选)
return redirect(url_for('index'))
@app.route('/clearcookie')
def clear_user_cookie():
response = make_response(redirect(url_for('index')))
# 通过设置空值并将过期时间设为过去来删除 cookie
response.set_cookie('username', '', expires=0)
return response
if __name__ == '__main__':
app.run(debug=True)

运行应用并访问 http://127.0.0.1:5000/。

交互描述:

最初,不存在名为 ‘username’ 的 cookie,因此应用会显示 ask_name.html 表单。当您输入姓名并提交时,一个 POST 请求会发送到 /setcookie。此路由会提取姓名,创建一个重定向响应,并使用 response.set_cookie() 将设置 cookie 的指令附加到该响应中。浏览器接收到重定向以及存储 cookie 的指令。在下一次对 / 的请求中,浏览器会将 ‘username’ cookie 发回。/ 路由使用 request.cookies.get('username') 读取此 cookie,并使用存储的姓名显示 show_greeting.html 模板。点击“Forget My Name”(忘记我的姓名)会跳转到 /clearcookie,该路由会发送指令来删除 cookie。

安全须知: 标准 cookies 以纯文本形式存储,用户可以轻松查看和修改它们,如果在不使用 HTTPS 的情况下,它们也可能被拦截。切勿将密码等敏感信息直接存储在 cookies 中。对于会话管理,请使用 Flask 的 session(会话)机制,该机制使用经过加密签名的 cookies。