簡體   English   中英

無法將WTForms數據提交到MySQL

[英]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_usernameconfirm_passwordreg_email屬性字符串。 您在錯誤消息中看到的值是TextField.__str__的返回值。

然后,將enter_db附加為Register的屬性。 enter_db是一個用Register.usernameRegister.passwordRegister.email的值實例化的User 然后,仍在類創建時,調用Register.enter_db.database並為其提供與用於實例化Register.enter_db相同的值。

在時間你賦值到沒有一點reg_usernameconfirm_passwordreg_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)

這使用字符串插值在執行之前將usernamepasswordemail的值直接放入語句中。 除了這是一種不好的做法之外,其中一個值中的任何'都會破壞您的陳述。 這就是您正在發生的事情,因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM