[英]Can't submit WTForms data into MySQL
无法提交WTForms数据到MySQL数据库,因为尽管我尝试将其转换为字符串,但提交的数据仍在“未绑定字段”和填充中。 不知道该怎么办。
我正在尝试使用Flask和WTForms创建注册表单。 当我将数据(用户名,密码,电子邮件)放入MySQL数据库时,出现以下错误:
我尝试到处寻找,但是没有地方可以解释如何解决此问题。 以下是相关代码:
class User():
global cur
cur = config.conn.cursor()
def __init__(self, username, password, email):
self.usr = username
self.pwd = password
self.mail = email
def database(self, username, password, email):
u_p_e = cur.execute("INSERT into users (username, pwd, e-mail) VALUES ('%s', '%s', '%s')"
% (username, password, email))
cur.commit()
class Register(Form):
reg_username = TextField('Username', [validators.Length(min=1, max = 12)])
username = str(reg_username)
reg_password = PasswordField('Password', [
validators.Required(),
validators.EqualTo('confirm_password', message='Passwords do not match')
])
confirm_password = PasswordField('Confirm Password')
password = str(confirm_password)
reg_email = TextField('Email', [validators.Length(min=6, max=35)])
email = str(reg_email)
enter_db = User(username, password, email)
enter_db.database(username, password, email)
我是使用Flask / WTForms进行Web开发的新手。
如架构对象名称中所述 :
MySQL中的某些对象(包括数据库,表,索引,列,别名,视图,存储过程,分区,表空间和其他对象名)称为标识符。
[ 删除 ]标识符在内部转换为Unicode。 它们可能包含以下字符:
未加引号的标识符中允许的字符:
ASCII:[0-9,az,AZ $ _](基本拉丁字母,数字0-9,美元,下划线)
扩展:U + 0080 .. U + FFFF
带引号的标识符中允许的字符包括完整的Unicode基本多语言平面(BMP),但U + 0000除外:
ASCII:U + 0001 .. U + 007F
扩展:U + 0080 .. U + FFFF
[ 删除 ]标识符引号是反引号(“
`
”):
因此,要将连字符添加到您e-mail
列名称中(通常是个坏主意),必须在反引号中加上标识符。
您的代码有两个问题。
第一个问题是如何定义课程。
class Register(Form):
reg_username = TextField('Username', [validators.Length(min=1, max = 12)])
username = str(reg_username)
reg_password = PasswordField('Password', [
validators.Required(),
validators.EqualTo('confirm_password', message='Passwords do not match')
])
confirm_password = PasswordField('Confirm Password')
password = str(confirm_password)
reg_email = TextField('Email', [validators.Length(min=6, max=35)])
email = str(reg_email)
enter_db = User(username, password, email)
enter_db.database(username, password, email)
您的通话str
创建该类时发生,转换reg_username
, confirm_password
和reg_email
属性字符串。 您在错误消息中看到的值是TextField.__str__
的返回值。
然后,将enter_db
附加为Register
的属性。 enter_db
是一个用Register.username
, Register.password
和Register.email
的值实例化的User
。 然后,仍在类创建时,调用Register.enter_db.database
并为其提供与用于实例化Register.enter_db
相同的值。
在时间你赋值到没有一点reg_username
, confirm_password
和reg_email
领域。 这通常通过在实例化Register
时提供request.form
来完成,例如form = Register(request.form)
。 完成此操作后,您将可以通过form.reg_username.data
等访问每个字段的值。这部分通常在视图函数中进行。
您遇到的第二个问题是如何执行SQL语句。
"INSERT into users (username, pwd, e-mail) VALUES ('%s', '%s', '%s')"
% (username, password, email)
这使用字符串插值在执行之前将username
, password
和email
的值直接放入语句中。 除了这是一种不好的做法之外,其中一个值中的任何'
都会破坏您的陈述。 这就是您正在发生的事情,因为TextField.__str__
在字段名称周围包含单引号。
更好(更安全)的方法是使用参数化查询。 尽管具体情况因驾驶员而异,但我相信?
是一个非常常见的实现。 这会将您的查询更改为以下内容:
"INSERT into users (username, pwd, email) VALUES (?, ?, ?)"
然后将值传递给cur.execute
cur.execute("INSERT into users (username, pwd, email) VALUES (?, ?, ?)", (username, password, email))
解决这两个问题将使您走上正确的道路。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.