2014-02-19 41 views
0

無法提交WTForms數據到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開發的新手。

+0

我對WTForms一無所知,但這不可能是正確的:你在表單定義本身,在課堂上做所有的數據庫工作。您大概需要在處理表單的處理程序中執行此操作,它將接受POST數據並進行驗證。 –

回答

0

你的代碼有兩個問題。

第一個問題是你如何定義你的班級。在創建類時

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_username,confirm_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)) 

解決這兩個應該把你在正確的道路上。

0

由於Schema Object Names下記載:

Certain objects within MySQL, including database, table, index, column, alias, view, stored procedure, partition, tablespace, and other object names are known as identifiers.

[ deletia ]

Identifiers are converted to Unicode internally. They may contain these characters:

  • Permitted characters in unquoted identifiers:

    • ASCII: [0-9,a-z,A-Z$_] (basic Latin letters, digits 0-9, dollar, underscore)

    • Extended: U+0080 .. U+FFFF

  • Permitted characters in quoted identifiers include the full Unicode Basic Multilingual Plane (BMP), except U+0000:

    • ASCII: U+0001 .. U+007F

    • Extended: U+0080 .. U+FFFF

[ deletia ]

The identifier quote character is the backtick (「 ` 」):

因此,包括在你的e-mail列名連字符(通常是一個壞主意),必須報價在反引號的標識符。

+0

從電子郵件中刪除破折號取得了一些進展,我必須感謝你,但我現在得到這個錯誤:http://i.imgur.com/1PvXtUV.png - 我似乎無法找到「用戶名」的語法有什麼問題? –