- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
无法将 WTForms 数据提交到 MySQL 数据库,因为提交的数据仍在未绑定(bind)字段等内容中,尽管我尝试将其转换为字符串。不知道该怎么办。
我正在尝试使用 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 开发的新手。
最佳答案
您的代码有两个问题。
第一个问题是如何定义类。
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
是一个 User
,使用 Register.username
、Register.password
和 Register 的值实例化.电子邮件
。然后,仍然在类创建时,您调用 Register.enter_db.database
并为其指定与用于实例化 Register.enter_db
相同的值。
您在任何时候都不会为 reg_username
、confirm_password
和 reg_email
字段赋值。这通常是通过在实例化 Register
时提供 request.form
来完成的,例如 form = Register(request.form)
。完成此操作后,您将能够通过 form.reg_username.data
等访问每个字段的值。这部分通常在 View 函数中进行。
您遇到的第二个问题是如何执行 SQL 语句。
"INSERT into users (username, pwd, e-mail) VALUES ('%s', '%s', '%s')"
% (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))
解决这两个问题应该会让您走上正确的道路。
关于python - 无法将 WTForms 数据提交到 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21873874/
我是一名优秀的程序员,十分优秀!