2017-01-14 3 views
0

Я пытаюсь создать форму регистрации с помощью Flask и пытаться отправить записи пользователя в базу данных MySQL.Flask-MySQL Как эффективно INSERT INTO таблица с параметризованными запросами

У меня нет большого успеха при использовании параметризованных запросов. Вот мой app.py код:

from flask import Flask, render_template, request, json 
from flaskext.mysql import MySQL 
from werkzeug import generate_password_hash, check_password_hash 

mysql = MySQL() 
app = Flask(__name__) 

with open('config.json', 'r') as f: 
config = json.load(f) 

app.config['MYSQL_DATABASE_USER'] = config['user'] 
app.config['MYSQL_DATABASE_PASSWORD'] = config['password'] 
app.config['MYSQL_DATABASE_DB'] = config['database'] 
app.config['MYSQL_DATABASE_HOST'] = config['host'] 
mysql.init_app(app) 

@app.route("/") 
def main(): 
    return render_template('index.html') 

@app.route('/showSignUp') 
def showSignUp(): 
    return render_template('signup.html') 

@app.route('/signUp',methods=['POST','GET']) 
def signUp(): 

    try: 
    _name = request.form['inputName'] 
    _email = request.form['inputEmail'] 
    _password = request.form['inputPassword'] 
    _username = request.form['inputUsername'] 


    # validate the received values 
    if _name and _email and _password and _username: 

     conn = mysql.connect() 
     cursor = conn.cursor() 

     query = "select * from tbl_user where user_email = %s" 
     cursor.execute(query, (_email)) 
     data = cursor.fetchall() 


     if len(data) is 0: 

      _hashed_password = generate_password_hash(_password) 
      query = "insert into tbl_user (user_name,user_username,user_password,user_email) values (%s,%s,%s,%s)" 

      cursor.execute(query, (_name, _username, _hashed_password, _email)) 
      conn.commit() 

      return json.dumps({'message':'User created successfully !'}) 

     else: 
      return json.dumps({'error':str(data[0]), 
           'message':'An account associated with this email address already exists.' 

       }) 
    else: 
     return json.dumps({'html':'<span>Enter the required fields</span>'}) 

    except Exception as e: 
    return json.dumps({'error':str(e)}) 

    finally: 
    cursor.close() 
    conn.close() 

if __name__ == "__main__": 
    app.run(debug = True) 

Вот что я пытался до сих пор:

  • Жестко запрограммированные значения work.The конкретной проблемы я имею с этим запросом. Когда я использую параметры, это не сработает, но когда я использую кодированные значения, это делает.

    query = "insert into tbl_user (user_name,user_username,user_password,user_email) values (%s,%s,%s,%s)"    
    cursor.execute(query, (_name, _username, _hashed_password, _email)) 
    conn.commit() 
    
  • Простой запрос с 1 параметром: В приведенном ниже коде, отлично работает с параметром и возвращает ожидаемые результаты, поэтому я запутался, почему другой запрос не работает.

    query = "select * from tbl_user where user_email = %s" 
    cursor.execute(query, (_email)) 
    data = cursor.fetchall() 
    
  • Отладка кода с заявлениями для печати в консоли: для того, что стоит, я также пытался печатать значения, как показано ниже, и ничего не будет печатать в моей консоли ... который, кажется мне очень странным ,

    if len(data) is 0: 
    
        list_of_values = [_name, _username, _hashed_password, _email] 
        print (list_of_values) 
    
        _hashed_password = generate_password_hash(_password) 
        query = "insert into tbl_user (user_name,user_username,user_password,user_email) values (%s,%s,%s,%s)" 
    
        cursor.execute(query, (_name, _username, _hashed_password, _email)) 
        conn.commit() 
    
  • Различные питона - MySQL пакеты: в дополнение к Колба-MySQL Я также попытался PyMySQL и имели один и тот же вопрос.

+0

Итак, какие проблемы вы получаете? Сообщение об ошибке, никаких запросов и т. Д. –

+0

@ IronFist, извинения. Я должен был быть более конкретным. Данные не вставляются в таблицу mysql. Я отвечаю на ваше решение ниже. Благодарю. – JSC

ответ

1

Попробуйте использовать словарь в качестве параметра, который является более удобным для чтения:

params = { 
    '_name' : request.form['inputName'] 
    '_email' : request.form['inputEmail'] 
    '_password' : request.form['inputPassword'] 
    '_username' : request.form['inputUsername'] 
} 

Тогда:

query = """insert into tbl_user (user_name, user_username, user_password, user_email) 
     values (%(_name)s, %(_username)s, %(_password)s, %(_email)s)""" 

cursor.execute(query, params) 
+1

На всякий случай я хотел бы подчеркнуть, насколько важно передавать параметры драйверу и не выполнять интерполяцию вручную, чтобы избежать инъекции SQL. – 9000

+0

@IronFist, спасибо за предложение. Решение действительно работает, и я согласен, это более читаемо. Однако я нашел проблему. Что вызывает у меня проблемы, это -hasshed_password '_hashed_password = generate_password_hash (_password)' . После того, как я удалил эту строку и просто использовал переменную _password, как ваше решение, так и мое работало. Я интригую о том, почему эта линия испортит все остальное. Еще раз спасибо за вашу помощь. – JSC

+0

@ 9000 - передавая параметры водителю, вы имеете в виду: 'params = (_name, _username, _password, _email)
query =" "" Вставить в tbl_user (имя_пользователя, user_username, user_password, user_email) значения (% s ,% s,% s,% s) "" "
cursor.execute (query, params)'? Спасибо – JSC

1

Как я уже говорил в одном из комментариев, что создание вопрос была функция generate_hashed_password(). Проведя некоторое исследование в StackOverflow, я обнаружил, что эта функция генерирует строки, которые больше, чем исходный пароль ... поэтому я закончил обновление столбца пароля MySQL таблицы от VARCHAR (45) до VARCHAR (100), и это позаботилось о проблеме ,

Смежные вопросы