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
相关产品推荐
相关产品推荐

