[英]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.