【问题标题】:Flask Mysql Connector issueFlask Mysql 连接器问题
【发布时间】:2018-06-09 08:38:02
【问题描述】:

在flask上制作一个简单的登录/注册应用程序,我遇到了这个问题?

我在这里做错了什么?注册表完美运行。登录部分不起作用 我该如何解决。 我必须这样做才能用 python 的 mysql.connector 替换 flask-mysqldb

我在登录提交时收到此错误:

mysql.connector.errors.InternalError

mysql.connector.errors.InternalError:找到未读结果

为登录创建与 dB 的新连接,出现此错误

builtins.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)

【问题讨论】:

  • 请包含完整的回溯。您是否尝试过不带括号运行result = cur.execute("SELECT * FROM users WHERE username = %s", username)?否则,尝试将result 打印到控制台
  • 至于未读结果错误,尝试将cur = cnx.cursor(dictionary=True)改为cur = cnx.cursor(dictionary=True, buffered=True)
  • 确实 result 没有向控制台返回任何内容,只有下一行 :data = cur.fetchone()" 将整个记录作为字典返回。
  • 啊,就是这样。一个执行查询返回任何东西。它是光标对象本身。删除result = 部分。然后您可以将if result > 0 更改为if cur(如果在用户名中未找到匹配项,则应为 NoneType)。虽然可能是错误的,但只是一个猜测
  • 啊,好吧。我也不太熟悉 mysql.connector 的工作原理。顺便说一句,在上面我的意思是if cur: 不是if cur > 0:,对不起!

标签: python mysql flask


【解决方案1】:

不需要关闭连接再重新打开,你可以用这个代替:

your_database.get_conn()

【讨论】:

    猜你喜欢
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2011-11-14
    • 2010-12-18
    • 2011-07-24
    • 1970-01-01
    • 2019-09-10
    相关资源
    最近更新 更多