You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask如何基于登录用户名从PostgreSQL为不同用户展示对应专属数据

实现方案

前置说明

原有代码存在SQL注入高危漏洞,调整时会同步修复该问题。

调整步骤

第一步:修改app.py代码

需要新增用户登录状态校验、参数化查询、用户全字段查询逻辑,修改后完整代码如下:

from flask import Flask, render_template, request, session, redirect, url_for
import psycopg2
from psycopg2.extras import RealDictCursor # 导入字典游标,方便按字段名取数

app = Flask(__name__)
app.secret_key = 'mykey123'

# 封装数据库连接方法,避免重复写连接逻辑
def get_db_connection():
    conn = psycopg2.connect(host="****", port = 5432, database="***", user="****", password="*****")
    return conn

@app.route("/", methods = ["GET", "POST"])
def login():
    msg = ""
    if (request.method == "POST"):
        username = request.form["username"]
        password = request.form["password"]
        conn = get_db_connection()
        # 使用字典游标
        c = conn.cursor(cursor_factory=RealDictCursor)
        # 使用参数化查询,避免SQL注入漏洞
        c.execute("SELECT * FROM public.person WHERE username = %s and password = %s", (username, password))
        r = c.fetchone() # 用户名唯一的场景下直接取单条即可,无需遍历
        c.close()
        conn.close()
        if r:
            session["logedin"] = True
            session["username"] = username
            return redirect(url_for("about"))
        else:
            msg = "Please enter valid username and password"
    return render_template("login.html", msg=msg)

@app.route("/about")
def about():
    # 先校验登录状态,未登录直接跳转登录页
    if not session.get("logedin"):
        return redirect(url_for("login"))
    # 根据当前登录用户名查询完整用户信息
    conn = get_db_connection()
    c = conn.cursor(cursor_factory=RealDictCursor)
    c.execute("SELECT id, username, email, gender, country FROM public.person WHERE username = %s", (session.get("username"),))
    user_info = c.fetchone()
    c.close()
    conn.close()
    # 将用户信息传递给前端模板
    return render_template("about.html", user=user_info)

@app.route("/logout")
def logout():
    session.clear()
    return redirect(url_for("login"))

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

第二步:修改about.html代码

在页面中新增字段展示逻辑,修改后完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>About Page</title>
    <meta charset="UTF-8">
</head>
<body>
<h1>Hello {{ user.username }}</h1>
<h2>你的个人信息如下:</h2>
<ul>
    <li>用户ID:{{ user.id }}</li>
    <li>邮箱:{{ user.email }}</li>
    <li>性别:{{ user.gender }}</li>
    <li>国家:{{ user.country }}</li>
</ul>
<h1><a href="/logout">Logout</a></h1>
</body>
</html>

补充说明

如果你的数据库表字段顺序固定,不想用RealDictCursor,也可以通过索引取值,比如user[0]对应id、user[3]对应email等,根据你表的实际字段顺序调整即可。

内容的提问来源于stack exchange,提问作者Galat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:06:03