我正在尝试从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()
我正在尝试使该程序在注册后将我重定向到“关于”页面。但是,我没有重定向到任何网页,数据库也没有更新。我也没有收到任何错误消息,因此我认为这可能是逻辑错误。
有人可以告诉我我要去哪里错了,并给我提示如何前进吗?
非常感谢。
答案 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)