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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:10:58