跟ChatGPT学Flask网络编程(3) – Session

这篇文章我们来看下Flask的会话(Session)功能。

:什么是Flask的会话(Session)?

ChatGPT: 在 Flask 中,会话(Session)是一种在客户端和服务器之间存储数据的机制。会话允许您在多个请求之间存储和检索数据,这对于实现登录认证、跨请求的表单数据传递和用户跟踪等功能非常有用。Flask 会话的实现基于客户端的 Cookie 技术,Flask 将会话数据编码为一个加密的 Cookie 并发送到客户端,客户端再将该 Cookie 存储在本地。每次客户端发送请求时,Flask 将解密并读取该 Cookie 中的会话数据,并将其存储在服务器端的内存中。这样,就可以在多个请求之间共享数据了。Flask 会话的操作非常简单,可以使用 session 对象来读取、写入和删除会话数据。例如,在下面的代码中,我们将一个字符串存储到会话中,并在后续请求中读取该字符串:


from flask import Flask, session

app = Flask(__name__)
app.secret_key = 'my-secret-key'  # 设置加密密钥

@app.route('/set')
def set_session():
    session['my_key'] = 'my-value'  # 将字符串存储到会话中
    return 'Session is set'

@app.route('/get')
def get_session():
    my_value = session.get('my_key')  # 从会话中读取字符串
    return f'Session value is: {my_value}'

在上面的代码中,我们首先设置了一个加密密钥,然后定义了两个路由 /set 和 /get。在 /set 路由中,我们将一个字符串 ‘my-value’ 存储到会话中,而在 /get 路由中,我们从会话中读取该字符串并将其返回给客户端。需要注意的是,在使用 Flask 会话时,必须设置一个加密密钥(例如上面代码中的 app.secret_key),该密钥将用于加密和解密会话数据,以防止数据被篡改。网页运行结果/set页:

图片

/get页:

图片

询问一下Session的数据类型,看上去有点像python的列表

:session[‘my_key’] = ‘my-value’中使用了方括号[ ],表示该对象是一个列表数据类型吗?

ChatGPT: 虽然 session[‘my_key’] 中使用了方括号,但它并不表示 session 对象是一个列表数据类型。实际上,session 对象是一个类似于字典(dictionary)的对象,可以像字典一样使用方括号来读取、写入和删除其中的键值对。在 session[‘my_key’] = ‘my-value’ 中,我们使用方括号 [] 来将 ‘my-value’ 存储到键为 ‘my_key’ 的位置。这与使用字典的方式非常相似,例如 my_dict[‘my_key’] = ‘my-value’ 将一个键值对存储到字典 my_dict 中。需要注意的是,由于 Flask 会话是基于客户端 Cookie 实现的,因此存储在会话中的数据量应该尽可能地小,以避免 Cookie 过大而影响性能。通常情况下,会话数据应该仅包含一些必要的状态信息,例如登录凭据、用户选项等。如果需要存储大量数据,应该考虑使用数据库或其他存储机制。

:如果要存储多个键值要怎么赋值?

ChatGPT:要存储多个键值对到 Flask 会话中,可以使用多次赋值语句,每次赋值一个键值对。例如,假设我们想要存储以下两个键值对:

my_key1 = 'my-value1'
my_key2 = 'my-value2'

我们可以按照如下方式将它们存储到 Flask 会话中:

from flask import session
session['my_key1'] = 'my-value1'
session['my_key2'] = 'my-value2'

注意,在存储多个键值对时,每个键都需要是唯一的,否则后面的赋值语句会覆盖前面的。如果需要存储多个具有相同键名的值,可以使用列表或字典等数据结构来存储。例如,可以使用一个字典来存储多个用户的信息:

users = {
    'user1': {'name': 'Alice', 'age': 25},
    'user2': {'name': 'Bob', 'age': 30},
    'user3': {'name': 'Charlie', 'age': 35}
}

session['users'] = users

这样,整个字典对象就会存储到会话中,可以在需要的地方访问它。

接下来让ChatGPT编写一个简单的登录网页,欢迎用户。

:使用flask的session功能,编写一个简单的登录网页,当用户输入用户名登录时,网页上显示“欢迎回来”+“用户名”

ChatGPT:下面是一个使用 Flask 的 session 功能实现简单登录的例子:

from flask import Flask, render_template, request, session

app = Flask(__name__)
app.secret_key = 'mysecretkey' # 设置 secret key

@app.route('/')
def index():
    return render_template('login.html')

@app.route('/login', methods=['POST'])
def login():
    # 获取表单提交的用户名
    username = request.form['username']

    # 将用户名存储到 session 中
    session['username'] = username

    # 显示欢迎信息
    return '欢迎回来,{}'.format(username)

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

在上面的代码中,我们定义了一个包含两个路由的 Flask 应用。/ 路由用于显示登录表单,/login 路由用于接收表单数据,并将用户名存储到 Flask 的 session 中。当用户登录成功后,会在页面上显示欢迎信息。

登录表单的 HTML 代码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>登录</title>
  </head>
  <body>
    <h1>登录</h1>
    <form action="/login" method="post">
      <label>用户名:</label>
      <input type="text" name="username"><br><br>
      <input type="submit" value="登录">
    </form>
  </body>
</html>

当用户在表单中输入用户名并提交表单时,/login 路由会接收到 POST 请求。在该路由函数中,我们使用 request.form 获取表单提交的数据,将用户名存储到 Flask 的 session 中,并显示欢迎信息。在显示欢迎信息时,我们使用了 Python 的字符串格式化功能,将用户名插入到字符串中。

:flask session对象有哪些常用的方法?

ChatGPT: Flask 中的 session 对象是一个 Python 字典,可以使用常用的字典方法来对它进行操作。以下是常用的一些方法:

  • session.get(key, default=None): 获取指定键的值,如果不存在则返回默认值(如果设置了的话),否则返回 None。
  • session.pop(key, default=None): 弹出指定键的值,并返回该值,如果键不存在则返回默认值(如果设置了的话)。
  • session.clear(): 清空会话中的所有数据。
  • session.keys(): 返回会话中所有键的列表。
  • session.values(): 返回会话中所有值的列表。
  • session.items(): 返回会话中所有键值对的列表。
  • session.setdefault(key, default=None): 如果指定键不存在,则将其设置为指定的默认值,并返回该值。

此外,还有一些和 Flask 的上下文相关的方法,例如:

  • session.modified: 返回一个布尔值,表示会话对象是否已被修改。
  • session.permanent: 返回一个布尔值,表示会话是否为永久会话。
  • session.regenerate(): 重新生成会话 ID,常用于用户认证之后。

运行结果:

图片
图片

小结一下

1、会话(Session)是一种在客户端和服务器之间存储数据的机制,可用于登录认证、跨请求的表单数据传递和用户跟踪。

2、session对象的参数为字典数据类型。

3、在使用 Flask 会话时,必须设置一个加密密钥。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注