Проблема с соединителем Flask Mysql

Создание простого приложения для входа/регистрации на фляге, и я столкнулся с этой проблемой?

Что я здесь делаю неправильно? Форма регистрации работает отлично. Не работает раздел авторизации Как исправить. Я должен сделать это, чтобы заменить flask-mysqldb на mysql.connector для python.

Я получаю эту ошибку при входе в систему:

mysql.connector.errors.InternalError

mysql.connector.errors.InternalError: найден непрочитанный результат

создание нового подключения к дБ для входа в систему дает мне эту ошибку

встроенные .TypeError

TypeError: '>' не поддерживается между экземплярами 'NoneType' и 'int'

app.py это:

from flask import Flask, render_template, flash, redirect, url_for, session, request, logging
from wtforms import Form, StringField, TextAreaField, PasswordField, validators
from passlib.hash import sha256_crypt
import mysql.connector

app = Flask(__name__)

app.secret_key='secretkey'


#Config MySQL
cnx = mysql.connector.connect(user='jay', password='jay',
                              host='127.0.0.1',
                              database='usertable')
#cnx.close()

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


class RegisterForm(Form):
    name = StringField('Name', [validators.Length(min=1, max=50)])
    username = StringField('Username', [validators.Length(min=4, max=25)])
    email = StringField('Email', [validators.Length(min=6, max=50)])
    password = PasswordField('Password', [
        validators.DataRequired(),
        validators.EqualTo('confirm', message='Passwords do not match')
        ])
    confirm = PasswordField('Confirm Password')



@app.route('/register', methods=['GET','POST'])
def register():
    form = RegisterForm(request.form)
    if request.method == 'POST' and form.validate():
        name = form.name.data
        email = form.email.data
        username = form.username.data
        password = sha256_crypt.encrypt(str(form.password.data))
        #connect to db
        #create Cursor
        cur = cnx.cursor()
        cur.execute("INSERT INTO users(name, email, username, password) VALUES(%s, %s, %s, %s)", (name, email, username, password))
        #commit 2 DB
        cnx.commit()
        #close connection
        cur.close()
        cnx.close()
        flash('You are now registered and can log in', 'success')

        return redirect(url_for('login'))


    return render_template('register.html', form=form)


#USER login CONFIGURaTION
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        #get form fields
        username = request.form['username']
        password_candidate = request.form['password']
        #connect to db
        conn = mysql.connector.connect(user='jay', database='table_users')
        #cursor creation
        cur = cnx.cursor(dictionary=True, buffering=True)
        #get user by username
        result = cur.execute("SELECT * FROM users Where username = %s", [username])

        if cur:
            #get stored hash
            data = cur.fetchone()

            password = data['password']
            #compare passwords
            if sha256_crypt.verify(password_candidate, password):
                app.logger.info('Password MATCHED')
            else:
                app.logger.info('Password not MATCHED')
        else:
            app.logger.info('No USER')
        cur.close()
        cnx.close()


    return render_template('signin.html')




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

person 2milli    schedule 28.12.2017    source источник
comment
пожалуйста, включите полную трассировку .. вы пытались запустить result = cur.execute("SELECT * FROM users WHERE username = %s", username) без скобок? в противном случае попробуйте вывести result в консоль   -  person Mangohero1    schedule 28.12.2017
comment
Что касается ошибки непрочитанного результата, попробуйте изменить cur = cnx.cursor(dictionary=True) на cur = cnx.cursor(dictionary=True, buffered=True)   -  person Mangohero1    schedule 28.12.2017
comment
действительно результат ничего не возвращает в консоль, только следующая строка :data = cur.fetchone() возвращает всю запись в виде dict.   -  person 2milli    schedule 28.12.2017
comment
Ах, в том-то и дело. Запрос на выполнение ничего не возвращает. Это сам объект курсора. Удалите часть result = . Затем вы можете изменить if result > 0 на if cur (должно быть NoneType, если совпадение в имени пользователя не найдено). Хотя может и ошибаюсь, но только предположение   -  person Mangohero1    schedule 28.12.2017
comment
Я предполагаю, что проблема может быть где-то в соединении, которое я установил. Где я должен закрыть соединение после registerForm и снова начать соединение для входа в систему? Я думаю, что это проблема как-то. Это первый раз, когда я использую mysql.connector.   -  person 2milli    schedule 28.12.2017
comment
Без части результата и изменения, если cur › 0, я получаю следующую ошибку: встроенные.TypeError TypeError: «›» не поддерживается между экземплярами «MySQLCursorBufferedDict» и «int»   -  person 2milli    schedule 28.12.2017
comment
Ах хорошо. Я тоже не знаком с тем, как работает mysql.connector. Кстати, выше я имел в виду if cur:, а не if cur > 0:, извините за это!   -  person Mangohero1    schedule 28.12.2017
comment
РЕШЕНО. cursor.close() и создание нового соединения решили проблему. Благодарим Вас за отправку исправленного варианта.   -  person 2milli    schedule 29.12.2017
comment
Рад, что смог помочь! Удачи. не стесняйтесь отвечать себе, и я с удовольствием проголосую за него   -  person Mangohero1    schedule 29.12.2017
comment
Все работает отлично, за исключением последнего, если (app.logger.info('No USER')) теперь представляет следующую ошибку: встроенные.TypeError TypeError: объект «NoneType» не подлежит подписке   -  person 2milli    schedule 29.12.2017
comment
это странно, ничего синтаксического, что сразу бы выдало. Я предполагаю, что это может быть прерывистым соединением?   -  person Mangohero1    schedule 29.12.2017


Ответы (1)


не нужно закрывать соединение и снова открывать, вместо этого вы можете использовать это:

your_database.get_conn()
person michal    schedule 30.12.2017