Flask - Cookies
Flask – Cookies
Section titled “Flask – Cookies”HTTP Cookies(或简称 Cookie)是由网络浏览器存储在客户端计算机上的小段数据。网站使用它们来记住用户在多个请求之间的信息,例如登录状态、偏好设置或购物车中的商品。每次向同一域发送后续请求时,Cookie 都会被发送回服务器。
Cookies 在 Flask 中的工作原理
Section titled “Cookies 在 Flask 中的工作原理”- 设置 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 中,然后在用户后续访问时使用存储的姓名问候他们。
- 创建
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>- 创建
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>- 创建 Flask 应用 (
app.py文件):
from flask import Flask, render_template, request, make_response, redirect, url_forimport 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。