Flask 中文教程

第四部分:实战项目篇
第12章 入门级实战:个人博客系统
第13章 进阶级实战:RESTful API 服务
第五部分:部署运维与优化篇
第14章 Flask 应用部署
第15章 性能优化与安全加固
第六部分:问题解决与进阶篇
第16章 常见问题与解决方案
第17章 Flask 进阶与扩展

7.1 Cookie 操作

Flask Cookie 操作指南:设置、读取、删除与安全配置

Flask 中文教程

本教程详细讲解Flask中Cookie的设置、读取和删除操作,包括有效期、域名与路径配置,并提供安全注意事项如敏感数据加密,适合新手学习。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Flask Cookie 操作全面指南

什么是Cookie?

Cookie是存储在用户浏览器中的小型文本数据,用于在Web请求之间保持状态,例如用户登录信息或偏好设置。在Flask中,Cookie操作简单直观,适用于管理会话和个性化体验。

设置Cookie

在Flask中,使用response.set_cookie()方法设置Cookie。这个方法允许配置Cookie的名称、值和其他属性,如有效期、域名和路径。

基本语法

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/set_cookie')
def set_cookie():
    resp = make_response("Cookie已设置")
    resp.set_cookie('username', 'john_doe')
    return resp

高级配置

  • 有效期: 使用max_age(秒)或expires(datetime对象)控制Cookie的存活时间。
  • 域名: 通过domain参数指定Cookie有效的域名,默认为当前域名。
  • 路径: 使用path参数指定Cookie有效的路径,默认为'/'。
  • 安全标志: 设置secure=True确保Cookie仅通过HTTPS传输。
  • HttpOnly标志: 设置httponly=True防止JavaScript访问,增强安全性。

示例代码

@app.route('/set_cookie_with_config')
def set_cookie_with_config():
    resp = make_response("Cookie已设置并配置属性")
    resp.set_cookie(
        'user_id', 
        '12345', 
        max_age=3600,  # 有效期1小时
        domain='example.com',
        path='/home',
        secure=True,
        httponly=True
    )
    return resp

读取Cookie

从Flask请求中读取Cookie使用request.cookies字典,这是一个类似字典的对象,包含所有发送到服务器的Cookie。

代码示例

from flask import Flask, request

app = Flask(__name__)

@app.route('/read_cookie')
def read_cookie():
    username = request.cookies.get('username', '未设置')
    return f"用户名: {username}"
  • 提示: 使用.get()方法避免KeyError,提供默认值。

删除Cookie

删除Cookie通过设置一个已过期的Cookie来实现,可以设置max_age=0expires为过去的时间。

代码示例

@app.route('/delete_cookie')
def delete_cookie():
    resp = make_response("Cookie已删除")
    resp.set_cookie('username', '', max_age=0)
    return resp

Cookie有效期、域名与路径配置详解

  • 有效期: 使用max_age指定Cookie在浏览器中的存活时间(秒)。例如,max_age=86400表示Cookie有效一天。expires参数接受datetime对象,但max_age更常用。
  • 域名: 默认情况下,Cookie仅在设置它的域名下有效。通过domain参数可以限制Cookie到特定子域名,例如domain='.example.com'允许所有子域名访问。
  • 路径: path参数定义Cookie在服务器上的有效路径。例如,path='/admin'仅当用户访问以/admin开头的页面时,Cookie才被发送。

配置示例

# 设置Cookie,有效期1天,仅在example.com及其子域名下有效,路径为/dashboard
resp.set_cookie('session', 'abc123', max_age=86400, domain='.example.com', path='/dashboard')

Cookie的安全注意事项

处理Cookie时,安全是关键。以下是重要的安全最佳实践:

  1. 加密敏感数据: 不要在Cookie中存储明文敏感信息(如密码、信用卡号)。使用加密库如itsdangerouscryptography进行加密。
  2. 使用HTTPS: 在传输敏感Cookie时,设置secure=True确保Cookie仅通过HTTPS发送,防止中间人攻击。
  3. 设置HttpOnly标志: 通过httponly=True防止跨站脚本攻击(XSS),确保Cookie不能通过JavaScript访问。
  4. SameSite属性: 虽然Flask的set_cookie()默认不设置SameSite,但现代浏览器支持它。可以通过添加SameSite='Lax'Strict'来防止跨站请求伪造(CSRF)。
  5. 定期更换会话ID: 如果使用Cookie管理会话,定期生成新的会话ID以减少会话劫持风险。

加密示例(使用itsdangerous)

from itsdangerous import TimedSerializer
from flask import Flask, make_response

app = Flask(__name__)
app.secret_key = 'your-secret-key'  # 设置安全密钥

def encrypt_data(data):
    s = TimedSerializer(app.secret_key)
    return s.dumps(data)

def decrypt_data(token):
    s = TimedSerializer(app.secret_key)
    return s.loads(token)

@app.route('/set_secure_cookie')
def set_secure_cookie():
    sensitive_data = {'user_id': 1001, 'role': 'admin'}
    encrypted_token = encrypt_data(sensitive_data)
    resp = make_response("安全Cookie已设置")
    resp.set_cookie('secure_data', encrypted_token, httponly=True, secure=True)
    return resp

@app.route('/read_secure_cookie')
def read_secure_cookie():
    token = request.cookies.get('secure_data')
    if token:
        data = decrypt_data(token)
        return f"解密数据: {data}"
    return "未找到安全Cookie"

完整示例:综合操作Cookie

以下是一个Flask应用示例,展示设置、读取、删除Cookie的完整流程。

from flask import Flask, request, make_response
from datetime import datetime, timedelta

app = Flask(__name__)

@app.route('/')
def index():
    return "欢迎使用Flask Cookie示例"

@app.route('/set')
def set():
    resp = make_response("设置了一个新Cookie")
    resp.set_cookie('last_visit', datetime.now().isoformat(), max_age=300, httponly=True)  # 5分钟有效期
    return resp

@app.route('/read')
def read():
    last_visit = request.cookies.get('last_visit', '从未访问')
    return f"上次访问时间: {last_visit}"

@app.route('/delete')
def delete():
    resp = make_response("Cookie已删除")
    resp.set_cookie('last_visit', '', max_age=0)
    return resp

if __name__ == '__main__':
    app.run(debug=True)

总结

本教程涵盖了Flask中Cookie的基础操作,包括设置、读取和删除,并详细解释了有效期、域名与路径配置。安全方面,强调了加密敏感数据、使用HTTPS和设置安全标志的重要性。通过实践示例,新手可以快速上手Flask Cookie管理。记住,总是优先考虑安全,遵循最佳实践来保护用户数据。

进一步学习

  • 探索Flask的session模块,它基于Cookie提供了更高级的会话管理。
  • 阅读Flask官方文档以获取更多API细节和更新。
  • 实践在真实项目中应用这些概念,例如构建用户登录系统。
开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包