03 Flask之g对象

556次阅读
没有评论

共计 1424 个字符,预计需要花费 4 分钟才能阅读完成。

一. 什么是 g 对象

  • 在 flask 中,有一个专门用来存储用户信息的 g 对象,g 的全称的为 global
  • g 对象在一次请求中的所有的代码的地方,都是可以使用的

ps : 我们完全可以将用户数据存到 request 对象中 : request.name="shawn", 那为什么还要使用 g 对象?

再想想, 如果我们保存一个这样的数据 : request.method="xxx", 是不是就发现问题了, 为了避免这种重名的问题, flask 不推荐你使用 request 对象来保存数据, 而它所提供的 g 对象就是很好的选择

二.g 对象、flash、session 的区别

  • g 对象, 请求来一次 g 对象就改变了一次,或者重新赋值了一次, 比如在 login 路由中的 g 对象设置值,只能在 login 路由请求中获取,其它的请求都无法获取
  • flash 一旦设置,可在任意一次请求中获取,但是只能取一次

  • session 对象是可以跨 request 的,只要 session 还未失效,不同的 request 的请求会获取到同一个 session

三.g 对象的使用

1.g 对象的使用

  • 设值 : g.[变量名] = 变量值
  • 取值 : g.[变量名]

2. 示例

  • run.py
from flask import Flask, g, render_template, request

app = Flask(__name__)
app.debug = True


@app.route("/login/", methods=['GET', 'POST'])
def login():
    if request.method == "GET":
        return render_template('login.html')
    else:
        username = request.form.get("username")
        password = request.form.get("password")
        if username == "shawn" and password == "123":
            g.username = username
            g.password = password
            login_info()
            return " 登入成功!!"
        else:
            return " 用户名或密码错误!!"

@app.route('/index/')
def index():
    try:
        print(g.username)
        print(g.password)
    except Exception as e:
        print(e)  # 抛出异常:'_AppCtxGlobals' object has no attribute 'username'
    return 'ok'

def login_info():
    print(f" 当前登入用户名:{g.username}\n 当前登入密码:{g.password}")
    """
    当前登入用户名:shawn
    当前登入密码:123
    """

if __name__ == '__main__':
    app.run()
  • login.html
<body>
<form action="" method="post">
    <input type="text" placeholder=" 用户名 " name="username">
    <input type="password" placeholder=" 密码 " name="password">
    <input type="submit" value=" 登入 ">
</form>
</body>
  • 先访问 "/login/" 路由, 能从 g 对象取出 username、password

  • 访问 "/index/" 路由, 显示 g 对象没有该属性

  • 说明每次请求都是新的 g 对象

正文完
 
shawn
版权声明:本站原创文章,由 shawn 2023-06-16发表,共计1424字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)