如何在Flask站点的SQLAlchemy数据库中修改用户score值?
Flask点击按钮更新用户Score问题解决方案
问题描述
我正在搭建一个简单的Flask Python站点,核心逻辑为用户每点击一次按钮即可获得1分,目前已有简易登录系统,后续将添加密码功能。当前遇到的问题是,用户点击按钮时,无法修改SQLAlchemy数据库中对应用户的score列值。
相关代码如下:
from flask import Flask, redirect, url_for, render_template, request, session, flash from datetime import timedelta from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.secret_key = "nicetry" app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.sqlite3' app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False app.permanent_session_lifetime = timedelta(minutes=5) db = SQLAlchemy(app) class users(db.Model): _id = db.Column("id", db.Integer, primary_key=True) name = db.Column(db.String(100)) email = db.Column(db.String(100)) score = db.Column(db.Integer) def __init__(self, name, email, score): self.name = name self.email = email self.score = score @app.route("/clicker") def clicker(): return render_template("clicker.html") # 打开带按钮的页面,点击按钮时调用buttonclick() @app.route('/buttonclick', methods=['POST']) def buttonclick(): print("button pressed") # HERE! 需要编写更新score的代码 return 'Success'
未展示登录流程(用户输入用户名和邮箱)及基础HTML/CSS代码,不确定buttonclick函数中如何编写数据库更新语句,实现点击按钮score加1的功能。
解决方案
要实现点击按钮更新用户score,需要从session中获取当前登录用户的标识,查询到对应用户对象后修改score并提交到数据库,具体步骤如下:
1. 确保登录时存储用户标识到session
登录成功后,将用户的唯一标识(比如id、name或email)存入session,示例代码:
# 假设登录处理函数中,验证用户后执行 user = users.query.filter_by(name=input_name, email=input_email).first() if user: session['user_id'] = user._id # 存储用户id到session
2. 修改buttonclick函数更新score
根据session中存储的用户标识,查询用户并更新score:
@app.route('/buttonclick', methods=['POST']) def buttonclick(): print("button pressed") # 检查用户是否登录 if 'user_id' not in session: return '未登录', 401 # 未登录时返回错误 # 根据session中的user_id查询用户 current_user = users.query.get(session['user_id']) if not current_user: return '用户不存在', 404 # 用户不存在时返回错误 # 处理score可能为None的情况(若创建用户时未初始化score) if current_user.score is None: current_user.score = 1 else: current_user.score += 1 # 提交修改到数据库 db.session.commit() return 'Success'
其他查询方式(如果session存储的是name或email)
- 若session存储的是用户名:
current_user = users.query.filter_by(name=session['user_name']).first()
- 若session存储的是邮箱:
current_user = users.query.filter_by(email=session['user_email']).first()
内容的提问来源于stack exchange,提问作者bodoed
相关产品推荐
相关产品推荐

