当前位置: 首页 > news >正文

解释Flask框架中的session和request对象

Session对象

         在 Flask 和许多其他 Web 框架中,session 被视为一个字典对象(或类似字典的对象),用于在服务器端存储用户的会话数据。它实际上是一个特殊的对象,允许你像使用字典一样读取和写入数据。具体来说,session 的特点如下:

1. 类似字典的对象

在 Flask 中,session 是一个 SecureCookieSession 对象,通常是一个基于 cookies 的会话管理系统,以下是一些相关的细节:

  • 数据存储:存储在客户端的 cookie 中,能够跨请求保持状态;但不允许存储太多数据,因为 cookie 受大小限制。
  • 数据格式:存储为 JSON 格式,使其可以存储多个键值对。

你可以通过键值对的方式操作 session,直接存取用户的数据。

简单示例:

from flask import Flask, sessionapp = Flask(__name__)
app.secret_key = 'secret_key'  # 用于加密 session 数据@app.route('/set/')
def set_session():session['username'] = 'example_user'  # 设置 session 数据return 'Session data set!'@app.route('/get/')
def get_session():username = session.get('username')  # 获取 session 数据return f'Logged in as: {username}' if username else 'You are not logged in.'

        将用户名存入会话后可以通过验证会话来保持用户的登录状态。使用会话有以下几个优点:

  1. 简单性:会话管理相对简单,不需要复杂的逻辑就能维护用户的登录状态。
  2. 低开销:会话数据可以存储在服务器端内存或者数据库中,不需要每次都重复验证用户信息。
  3. 跨请求状态维护:通过会话,用户的状态(例如登录状态、用户信息等)可以跨多个请求维护。

2. 存储在服务器端

在 Flask 中,session 数据默认是存储在服务器的内存中,但你可以通过配置更改其存储方式,比如使用文件系统、数据库或其他后端存储服务。

3. 自动过期

session 数据一般会在用户的浏览器会话结束后失效(例如关闭浏览器),但你也可以配置会话的过期时间。

4. 安全性

为了防止用户篡改会话数据,Flask session 会对数据进行签名,使用 secret_key 进行加密。如果用户尝试修改 session 中的数据,修改后的数据会因缺少正确的签名而无法被识别。

Request对象 

        在 Flask 框架中,request 是一个全局对象,用于处理 HTTP 请求。它包含了客户端发送过来的所有信息,例如表单数据、查询参数、文件上传等。request 对象在 Flask 的 Request Context 中是可用的。

简单示例:

通过request对象获取的表单数据来设置 session :

@app.route('/login', methods=['POST'])
def login():session['username'] = request.form['username']  # 登录时设置 session@app.route('/logout')
def logout():session.pop('username', None)  # 清除 session

获取表单数据

当你通过表单(form)提交数据时,这些数据会被包含在 HTTP 请求中。Flask 提供了 request.form 代理对象来方便地访问这些表单数据。

综合示例代码

        以下是的 一个Flask 框架应用示例,展示了如何使用 request 对象获取表单数据从而实现用户注册,同时结合session对象分别实现在登录时将用户存入会话,在登出时清除会话。以下示例代码涉及ORM,使用用户类的对象来实现对数据库的操作,感兴趣的话请点击以下链接:Flask框架下使用SQLAlchemy搭建用户类User来操纵数据库-CSDN博客

from flask import Flask, request, session
from werkzeug.security import generate_password_hash, check_password_hash
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.secret_key = 'some_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)password = db.Column(db.String(120), nullable=False)# 用户注册示例
@app.route('/register', methods=['POST'])
def register():username = request.form['username']password = request.form['password']hashed_password = generate_password_hash(password)new_user = User(username=username, password=hashed_password)db.session.add(new_user)db.session.commit()return 'User registered successfully!'# 用户登录示例
@app.route('/login', methods=['POST'])
def login():username = request.form['username']password = request.form['password']user = User.query.filter_by(username=username).first()# 验证用户是否存在以及密码是否正确if user and check_password_hash(user.password, password):session['username'] = user.username  # 将用户名存入会话return 'Logged in successfully!'else:return 'Invalid username or password!'@app.route('/logout')
def logout():session.pop('username', None)  # 登出时清除会话return 'Logged out successfully!'if __name__ == '__main__':db.create_all()  # 创建数据库表app.run(debug=True)

       


http://www.mrgr.cn/news/48076.html

相关文章:

  • 基于Jenkins+Docker的自动化部署实践——整合Git与Python脚本实现远程部署
  • shell脚本(全)
  • 面试记录24年新
  • C语言项目 天天酷跑(上篇)
  • Java:189 基于SSM框架的在线电影评价系统
  • python+PyPDF2实现PDF的文本内容读取、多文件合并、旋转、裁剪、缩放、加解密、添加水印
  • 模型预测控制工具包——ACADO:通过Cmake构建自己的优化问题
  • lnmp - RBAC方案设计与实现
  • 使用阿里云盘将服务器上的文件上传/下载到云盘/服务器
  • MySQL数据库详细学习要点
  • 纯干货!详解Java并发之线程中断机制
  • Docker理念
  • Android Studio 安装和认识
  • SpringBoot集成Redis
  • 牛上脑和各类牛排的叫法,不要土老帽了~
  • v-html里面的标签设置样式没有用怎么办?
  • 【Linux调试工具】gdb/cgdb
  • 文件之间的输入输出
  • 在python中如何判断回文串(一)?
  • Linux内核 --内存管理之 Slab 分配器介绍
  • 太速科技-628-基于VU3P的双路100G光纤加速计算卡
  • Docker 入门篇
  • 【前端碎片记录】大文件分片上传
  • 【selenium】webdriver测试脚本
  • 常用的web服务器简述
  • ubuntu24 finalshell 无法连接ubuntu服务器, 客户端无法连接ubuntu, 无法远程连接ubuntu。