python - 无法将 WTForms 数据提交到 MySQL

标签 python mysql flask wtforms flask-wtforms

无法将 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_usernameconfirm_passwordreg_email 时字符串的属性。您在错误消息中看到的值是 TextField.__str__ 的返回值。

然后将 enter_db 附加为 Register 的属性。 enter_db 是一个 User,使用 Register.usernameRegister.passwordRegister 的值实例化.电子邮件。然后,仍然在类创建时,您调用 Register.enter_db.database 并为其指定与用于实例化 Register.enter_db 相同的值。

您在任何时候都不会为 reg_usernameconfirm_passwordreg_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/

相关文章:

python - KD 树最近邻搜索是如何工作的?

php - 围绕可选搜索参数构建 SQL 查询

mysql - 在 WHERE 条件下的 SQL 查询

mysql - 如何授予在mysql中写入全局变量的权限,例如slow_query_log?

python - 不可哈希类型 : 'dict' in Flask app

python - Flask 仅在 127.0.0.1 上监听而忽略主机参数

python - 如何在nosetests中使用正则表达式(即-m)在夹具中选择一些测试方法?

python - 无法从 python 3.5.2 升级到 3.6

python - RuntimeError : The session is unavailable because no secret key was set. 将应用程序上的 secret_key 设置为唯一且 secret 的内容

python - 如何从列表中删除所有非 float 数字和重复项