2014-02-19 3 views
0

제출 된 데이터가 언 바운드 필드 및 기타 항목에 있기 때문에 MySQL 데이터베이스에 WTForms 데이터를 전송할 수 없습니다. 문자열로 변환하려고했으나 WTForms 데이터를 MySQL 데이터베이스에 제출할 수 없습니다. 무엇을해야할지 모르겠습니다.WTForms 데이터를 MySQL에 제출할 수 없습니다.

플라스크 및 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를 사용하여 웹 개발에 익숙하지 않습니다.

Schema Object Names 아래의 문서로
+0

나는 WTForm에 대해 아무것도 몰라,하지만 이것은 옳지 않을 수 있습니다. 클래스 수준에서 양식 정의 자체에서 모든 데이터베이스 항목을 수행하고 있습니다. 폼을 처리하는 핸들러에서 POST 데이터를 승인하고 유효성을 검사하는 곳에서이 작업을 수행해야 할 것으로 추정됩니다. –

답변

0

코드에 두 가지 문제점이 있습니다.

첫 번째 문제는 클래스를 정의하는 방법입니다. str

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) 

통화는 클래스가 생성 될 때 발생하는 문자열에 reg_username, confirm_passwordreg_email 속성을 변환합니다. 오류 메시지에 표시되는 값은 TextField.__str__의 반환 값입니다.

그러면 Register의 속성으로 enter_db을 첨부하십시오. enter_dbRegister.username, Register.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) 

이 그것을 실행하기 전에 직접 문에 username, passwordemail의 값을 배치 할 문자열 보간을 사용합니다. 이것이 나쁜 습관 일뿐만 아니라 값 중 하나에 '이라면 진술을 깨뜨릴 것입니다. TextField.__str__에는 필드 이름 주위에 작은 따옴표가 포함되어 있기 때문에 이런 상황이 발생합니다.

매개 변수가있는 쿼리를 사용하는 것이 더 안전하고 (더 안전합니다) 접근 방법이 있습니다. 세부 사항은 드라이버마다 다르지만, 나는 ?이 꽤 일반적인 구현이라고 믿습니다. 이것은 당신은 다음 오른쪽 경로에 당신을 넣어해야이 두 가지를 해결 cur.execute

cur.execute("INSERT into users (username, pwd, email) VALUES (?, ?, ?)", (username, password, email)) 

에 값을 전달할 것

"INSERT into users (username, pwd, email) VALUES (?, ?, ?)" 

의 라인을 따라 뭔가 쿼리를 변경합니다.

0

:

따라서

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 - 찾을 수 없습니다. '사용자 이름'구문에 문제가 있습니까? –

관련 문제