为什么我的数据没有从我的Python Flask应用程序插入到MySQL数据库中?

时间:2019-07-29 15:08:46

标签: python mysql flask

我正在尝试从Flask Web应用程序中的注册表单向MySQL数据库中插入一些数据,但是提交后,这些数据不会输入数据库中。

我在Python的单独类中使用了数据库访问命令,但过去我也曾尝试将它们合并到“ app.py”文件中。

这是有关数据库详细信息的字典:

app.config['dbconfig'] = {'host': '127.0.0.1', 'user': 'adminu', 'password': 'password', 'database': 'app_uni'}

这是我显示注册表的方法,然后将输入数据存储到数据库中。

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterForm(request.form)
    if request.method == 'POST' and form.validate():
        with UseDB(app.config['dbconfig']) as cursor:
            _SQL = '''insert into student_users(username, email,      password, counsellor, grade, st_name)(%s, %s, %s, %s, %s, %s,)'''
        cursor.execute(_SQL, (form.username.data, form.email.data,   form.password.data, form.counsellor.data, form.grade.data,    form.st_name.data))
        flash('You are now registered and can log in', 'success')
        return redirect(url_for('/about'))
    return render_template('register.html', form=form)`

这是上下文管理的代码:

import mysql.connector

class UseDB:

    def __init__(self, config: dict):
        self.configuration = config

    def __enter__(self):
        self.conn = mysql.connector.connect(**self.configuration)
        self.cursor = self.conn.cursor()
        return self.cursor

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.conn.commit()
        self.cursor.close()
        self.conn.close()

我正在尝试使该程序在注册后将我重定向到“关于”页面。但是,我没有重定向到任何网页,数据库也没有更新。我也没有收到任何错误消息,因此我认为这可能是逻辑错误。

有人可以告诉我我要去哪里错了,并给我提示如何前进吗?

非常感谢。

2 个答案:

答案 0 :(得分:0)

我不确定为什么不进行重定向,但是我怀疑数据库未更新的原因是因为您正在with块之外执行SQL。你有:

with UseDB(app.config['dbconfig']) as cursor:
    _SQL = '''insert into student_users(username, email, password, counsellor, grade, st_name)(%s, %s, %s, %s, %s, %s,)'''
cursor.execute(_SQL, (form.username.data, form.email.data, form.password.data, form.counsellor.data, form.grade.data, form.st_name.data))

由于您在with块之外调用cursor.execute,因此UseDB.__exit__已被调用,并且与数据库的连接已关闭。我想你想要的是

with UseDB(app.config['dbconfig']) as cursor:
    _SQL = '''insert into student_users(username, email, password, counsellor, grade, st_name)(%s, %s, %s, %s, %s, %s,)'''
    cursor.execute(_SQL, (form.username.data, form.email.data, form.password.data, form.counsellor.data, form.grade.data, form.st_name.data))

如果cursor.execute由于关闭了连接而引发异常,则这也可能解释了为什么不进行重定向。

答案 1 :(得分:0)

这是您应该对url_for函数进行重定向的操作。它接受函数名称作为参数而不是url。

@app.route('/about', methods=['GET'])
def about():
    return render_template('about.html')

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegisterForm(request.form)
    if request.method == 'POST' and form.validate():
        with UseDB(app.config['dbconfig']) as cursor:
            _SQL = '''insert into student_users(username, email,      password, counsellor, grade, st_name)(%s, %s, %s, %s, %s, %s,)'''
            cursor.execute(_SQL, (form.username.data, form.email.data,   form.password.data, form.counsellor.data, form.grade.data,    form.st_name.data))
        flash('You are now registered and can log in', 'success')
        return redirect(url_for('about'))  # instead of the url, use the function name of /about
    return render_template('register.html', form=form)