Flask 中的 Session 和 Cookies、wtforms

news2025/1/11 6:11:00

Flask 中的 Session 和 Cookies

在构建 web 应用时,管理用户的状态和数据是至关重要的。Flask,作为一个灵活的微型 web 框架,提供了会话(Session)和 Cookies 管理的能力。本文将深入探讨 Flask 中的会话和 Cookies 的概念、工作机制以及应用实例,为读者提供全面而详细的理解。

会话和 Cookies 的基本概念

Cookies

  • 定义:Cookies 是服务器存储在用户浏览器上的小片段数据,每次浏览器向服务器发送请求时都会附带这些数据。
  • 用途:主要用于记住用户信息(如登录状态)、跟踪用户访问模式等。

会话(Session)

  • 定义:会话是一种在服务器上存储用户数据的方式,用于跨请求保持状态。
  • 用途:常用于存储用户特定的信息,如登录后的用户ID、购物车内容等。

Cookies 的使用

在 Flask 中操作 Cookies 是非常简单直观的。

设置 Cookies

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/set_cookie')
def set_cookie():
    response = make_response('Cookie has been set')
    response.set_cookie('username', 'John Doe')
    return response

获取 Cookies

from flask import request

@app.route('/get_cookie')
def get_cookie():
    username = request.cookies.get('username')
    return 'The username in cookie is: ' + str(username)

Cookies 的局限性

  • 存储在用户浏览器端

,因此容易受到安全攻击,如跨站脚本(XSS)和跨站请求伪造(CSRF)。

  • Cookies 的大小通常限制在 4KB 左右,不适合存储大量数据。

Flask 会话(Session)的使用

会话(Session)在 Flask 中用于存储在服务端的用户数据,而浏览器只保存一个会话ID的 Cookie。

配置 Flask 会话

在 Flask 应用中,需要设置一个密钥来加密会话数据。

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # 应为难以猜测的密钥

设置会话数据

from flask import session

@app.route('/login')
def login():
    session['user_id'] = '123456'  # 假设用户ID为123456
    return 'User logged in'

获取会话数据

@app.route('/profile')
def profile():
    user_id = session.get('user_id')
    if not user_id:
        return 'Not logged in!', 403
    return 'Profile page for user {}'.format(user_id)

会话的有效期

默认情况下,Flask 的会话是浏览器关闭时过期。也可以设置会话的持续时间:

from datetime import timedelta

app.permanent_session_lifetime = timedelta(days=5)
session.permanent = True  # 使当前会话持久化

会话与 Cookies 的安全性

安全性是管理会话和 Cookies 时必须考虑的重要因素。

安全实践

  • 使用 HTTPS 来防止会话被窃听。
  • 设置 Cookie 的 secure 标志,使其仅通过 HTTPS 发送。
  • 设置 Cookie 的 HttpOnly 标志,阻止 JavaScript 访问 Cookie。
  • 定期更换 secret_key
  • 对敏感数据进行加密处理。

使用 Flask-Session 扩展

对于需要更复杂会话管理的应用,可以使用 Flask-Session 扩展,它支持将会话数据保存在服务器端的多种后端中,例如 Redis、文件系统等。

flask-session

# 1 第三方 flask-session,可以把session的内容保存在服务端
	-redis
    -数据库
    -文件。。。
    
# 2 安装并使用
pip3 install flask-session

第一种

from flask_session.redis import RedisSessionInterface
import redis
app = Flask(__name__)
app.secret_key='adsfasdfads'
conn=redis.Redis(host='127.0.0.1',port=6379)
# 1 client:redis链接对象
# 2 key_prefix:放到redis中得前缀
# 3 use_signer:是否使用secret_key 加密
# 4 permanent:关闭浏览器,cookie是否失效
# 5 生成session_key的长度
app.session_interface=RedisSessionInterface(app,client=conn,key_prefix='session',use_signer=True, permanent=True, sid_length=32)

第二种(推荐)

from flask import Flask,session
from flask_session import Session
from redis import Redis
app = Flask(__name__)
app.secret_key='asdfasdf'
app.debug=True


# 配置信息,可以写在 配置文件中
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = Redis(host='127.0.0.1', port='6379')
# app.config['SESSION_KEY_PREFIX'] = 'lqz'  # 如果不写,默认以:SESSION_COOKIE_NAME 作为key
# app.config.from_pyfile('./settings.py')

Session(app)  # 核心跟第一种方式一模一样
  • app.py

from flask import Flask, session
from flask_session.redis import RedisSessionInterface
import redis

app = Flask(__name__)
conn = redis.Redis(host='127.0.0.1', port=6379)
# use_signer是否对key签名
app.session_interface = RedisSessionInterface(conn, key_prefix='lqz')


@app.route('/')
def hello_world():
    session['name'] = 'jing'
    return 'Hello World!'

@app.route('/index')
def index():
    res = session['name']

    return 'Hello World!' + res

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

  • settings.py

from redis import Redis

SESSION_TYPE = 'redis'
SESSION_REDIS = Redis(host='127.0.0.1', port='6379')

wtforms

​ 在Flask中,WTForms库主要用于处理Web表单的创建、验证和渲染。具体来说,WTForms在Flask中有以下几个关键用途:

  1. 表单验证:
    • WTForms提供了丰富的验证器,如DataRequiredLength等,用于验证用户提交的数据是否符合系统要求。
    • 通过这些验证器,可以确保表单数据的完整性、准确性和安全性。
    • 例如,可以使用DataRequired验证器来确保某个字段(如用户名或密码)必须被填写。
  2. 定义表单字段:
    • WTForms允许用户定义各种类型的表单字段,如文本字段、密码字段、单选按钮、复选框等。
    • 字段的定义与HTML表单元素相对应,使得开发者能够轻松地构建复杂的表单结构。
  3. 渲染表单为HTML:
    • 虽然WTForms本身不直接渲染HTML,但它可以与Flask的模板引擎(如Jinja2)结合使用,将表单渲染为HTML。
    • 这使得开发者能够灵活控制表单的显示样式和布局。
  4. 与Flask框架集成:
    • Flask-WTF是WTForms的Flask扩展,它简化了WTForms在Flask中的使用。
    • Flask-WTF提供了额外的功能,如CSRF保护、文件上传等,增强了表单的安全性。
  5. 自定义验证规则:
    • 除了内置的验证器外,WTForms还支持自定义验证规则。
    • 这使得开发者能够根据自己的业务需求来定义特定的验证逻辑。
  6. 表单继承:
    • WTForms支持表单继承,允许开发者创建基类表单,并在子类中扩展和覆盖字段和验证规则。
    • 这有助于实现代码的重用和模块化。
# pip install WTForms

# django--->forms组件
	-1 校验数据
    -2 错误处理
    -3 渲染页面
    
    
# flask--》第三方的wtforms
  • app.py

from flask import Flask, render_template, request, redirect
from wtforms import Form
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgets

app = Flask(__name__, template_folder='templates')

app.debug = True


class LoginForm(Form):
    # 字段(内部包含正则表达式)
    name = simple.StringField(
        label='用户名',
        validators=[
            validators.DataRequired(message='用户名不能为空.'),
            validators.Length(min=6, max=18, message='用户名长度必须大于%(min)d且小于%(max)d')
        ],
        widget=widgets.TextInput(),  # 页面上显示的插件
        render_kw={'class': 'form-control'}

    )
    # 字段(内部包含正则表达式)
    pwd = simple.PasswordField(
        label='密码',
        validators=[
            validators.DataRequired(message='密码不能为空.'),
            validators.Length(min=8, message='用户名长度必须大于%(min)d'),
            validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}",
                              message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符')

        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control'}
    )


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        form = LoginForm()
        return render_template('wtforms_login.html', form=form)
    else:
        form = LoginForm(formdata=request.form)
        if form.validate():
            print('用户提交数据通过格式验证,提交的值为:', form.data)
        else:
            print(form.errors)
        return render_template('wtforms_login.html', form=form)


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

  • wtforms_login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>登录</h1>
<form method="post">
    <p>{{form.name.label}} {{form.name}} {{form.name.errors[0] }}</p>
    <p>{{form.pwd.label}} {{form.pwd}} {{form.pwd.errors[0] }}</p>
    <input type="submit" value="提交">
</form>
</body>
</html>

image-20240614154055809

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1889276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

七项确保AI监管得当的原则

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Java8环境安装(jdk1.8安装)详细教程

Java 8环境安装&#xff08;jdk1.8安装&#xff09;详细教程 Java 8&#xff08;也称为JDK 1.8&#xff09;&#xff0c;是Oracle公司于2014年3月发布的一个重要的Java语言版本。这个版本自发布以来&#xff0c;因其众多的新特性和改进&#xff0c;被认为是Java语言发展历程中…

宁波职业技术学院DSP实验室建设案例—以及H264编码实验案例简介

宁波职业技术学院&#xff1a;勤信实 宁波职业技术学院是1999年由教育部批准成立的从事高等职业教育的全日制普通高校&#xff0c;2005年被评为全国职业教育先进单位&#xff0c;是国家首批示范性高等职业院校&#xff0c;教育部首批现代学徒制试点院校、浙江省五所重点建设高…

z-index的工作原理

z-index的工作原理 HTML文档中的元素却是存在于三个维度之中。除了大家熟知的平面画布中的x轴和y轴&#xff0c;还有控制第三维度的z轴。 像 margin , float , offset 这些属性&#xff0c;控制着元素在x轴和y轴上的表现形式一样。 z-index 这个属性控制着元素在z轴上的表现形…

一文详解多层感知机(MLP)

文章目录 What(是什么)Where&#xff08;用在哪&#xff09;How&#xff08;怎么用&#xff09;多层感知机解决分类问题&#xff08;以minist分类为例&#xff09;多层感知机解决回归问题多层感知机解决噪声处理的问题 What(是什么) 多层感知机&#xff08;Multilayer Perceptr…

PyTorch入门笔记

学习参考&#xff1a; PyTorch简单入门视频 深入浅出PyTorch 小土堆笔记 前置知识 AI vs ML vs DL AI&#xff08;Artificial Intelligence&#xff09;&#xff1a;通过让机器模仿人类进而超越人类ML&#xff08;Machine Learning&#xff09;&#xff1a;让机器模仿人类的一…

招聘应聘,HR如何测试候选人的领导能力?

作为企业的HR&#xff0c; 如何通过测评的方式来了解一个人的领导能力&#xff1f; 这里仅仅是说测评的方式&#xff0c;除此以外&#xff0c;还有很多方式&#xff0c;比如&#xff1a;背景调查&#xff0c;无领导小组讨论等等..... 对于一个人的领导能力测试&#xff0c;主要…

不使用AMap.DistrictSearch,通过poi数据绘制省市县区块

个人申请高德地图key时无法使用AMap.DistrictSearch&#xff0c;可以通过poi数据绘制省市县区块 1.进入POI数据网站找到需要的省市县&#xff0c;下载对应的GeoJson文件 &#xff0c;此处为poi数据网站链接 2.​ 处理geoJson数据&#xff0c;可以直接新建json文件&#xff0c;…

录音转文字软件免费版哪个好?6个转文字工具让你轻松记录

随着小暑的到来&#xff0c;炎热的天气容易让人心浮气躁&#xff0c;影响工作效率。 在这个季节里&#xff0c;掌握一些办公技巧尤为关键。尤其是当我们需要整理会议记录或讲座内容时&#xff0c;如果能有一种方法&#xff0c;可以迅速将那些冗长的录音转换成清晰的文字&#…

Zabbix 6.0 案例

自定义监控内容 案列&#xff1a;自定义监控客户端服务器登录的人数 需求&#xff1a;限制登录人数不超过 3 个&#xff0c;超过 3 个就发出报警信息 1.在客户端创建自定义 key 明确需要执行的 linux 命令 who | wc -l 2.在被监控主机的配置文件目录中&#xff08;/etc/za…

虚拟机的网络配置

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️ 每一步都向着梦想靠近&#xff0c;坚持就是胜利的序曲 一 …

7.3、指针所占内存空间

代码 #include <iostream> using namespace std;int main() {//指针所占内存空间int a 10;//int*p;//p &a;int* p &a;//在32为操作系统下&#xff0c;指针占4个字节空间大小//在64为操作系统下&#xff0c;指针占8个字节空间大小cout << "sizeof(…

【JVM排查问题】JProfiler性能分析工具连接远程服务器Docker容器中的Java服务

1、下载JProfiler https://www.ej-technologies.com/download/jprofiler/version_13 下载Windows版本以及Linux版本 Windows用于可视化、Linux用于在Docker容器中启动 2、将Linux版本的JProfiler上传到Docker容器中&#xff0c;宿主机cp命令到容器中 docker cp /home/data/s…

NPDP|产品经理的沟通协调能力:塑造产品成功的核心力量

在快速发展的商业环境中&#xff0c;产品经理的角色愈发重要。他们不仅要负责产品的战略规划、需求管理、项目管理&#xff0c;更要与团队内外各方进行有效的沟通协调。那么&#xff0c;产品经理的沟通协调能力到底有多重要呢&#xff1f;本文将深入探讨这一话题。 沟通是产品成…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP23S08(SPI接口)的I/O扩展器Proteus仿真

一、仿真原理图: 二、仿真效果: 三、STM32CubeMX配置: 1)、时钟配置: 2)、SPI配置: 四、部分软件: 1)、main主函数: /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file :…

MySQL环境搭配

下载版本37滴 下载第二个 之后进行安装 进入安装界面 next 选择默认的 进行下一步 安装成功后&#xff0c;进行一系列配置&#xff0c;成功界面如下&#xff1a; 配置 MySQL8.0 环境变量 如果不配置 MySQL 环境变量&#xff0c;就不能在命令行直接输入 MySQL 登录命令。 步…

八、函数的嵌套调用和链式访问

1.嵌套调用 函数和函数之间可以根据实际的需求进行组合的&#xff0c;也就是互相调用的。 #include <stdio.h> void new_line() {printf("hehe\n"); } void three_line() {int i 0;for (i 0; i < 3; i){new_line();} } int main() {three_line();return…

Google 发布了最新的开源大模型 Gemma 2,本地快速部署和体验

Gemma 2 是 Google 最新发布的开源大语言模型。它有两种规模&#xff1a;90 亿&#xff08;9B&#xff09;参数和 270 亿&#xff08;27B&#xff09;参数&#xff0c;分别具有基础&#xff08;预训练&#xff09;和指令调优版本&#xff0c;拥有 8K Tokens 的上下文长度&#…

gltf格式数据获取

之前写过两个文章&#xff0c;描述了三维模型怎样转换为gltf格式 SuperMap webgl 中使用的gltf模型制作方法_gltf 制作-CSDN博客 OBJ转GLTF格式步骤-CSDN博客 这两篇文章都可以将三维通用格式数据转换为gltf格式&#xff0c;但是过程都比较长&#xff0c;有的还需要安装开发…

Qt——升级系列(Level Eight):界面优化

目录 QSS 背景介绍 基本语法 QSS设置方式 指定控件样式设置 全局样式设置 从文件加载样式表 使用Qt Designer 编辑样式 选择器 选择器概况 子控件选择器 伪类选择器 样式属性 盒模型 控件样式示例 按钮 复选框、单选框 输入框 列表 菜单栏 登录界面 绘图 基本概念 绘制各种形…