Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python UnboundLocalError:局部变量';光标';分配前参考_Python_Mysql_Flask_Sqlalchemy_Mysql Python - Fatal编程技术网

Python UnboundLocalError:局部变量';光标';分配前参考

Python UnboundLocalError:局部变量';光标';分配前参考,python,mysql,flask,sqlalchemy,mysql-python,Python,Mysql,Flask,Sqlalchemy,Mysql Python,所以我是一个新手,但正在flask/MYSQL中编写注册系统表单 我收到此错误(UnboundLocalError:赋值前引用的局部变量“cursor”) 在玩了几个小时的代码和研究之后,我需要你的帮助 这是我的文件,如果还有什么需要分享的,请告诉我。 多谢各位 from flask import Flask, render_template, json, request from flask.ext.mysqldb import MySQL from werkzeug import gener

所以我是一个新手,但正在flask/MYSQL中编写注册系统表单

我收到此错误(UnboundLocalError:赋值前引用的局部变量“cursor”)

在玩了几个小时的代码和研究之后,我需要你的帮助

这是我的文件,如果还有什么需要分享的,请告诉我。 多谢各位

from flask import Flask, render_template, json, request
from flask.ext.mysqldb import MySQL
from werkzeug import generate_password_hash, check_password_hash

app = Flask(__name__)
mysql = MySQL()


app.config['MYSQL_DATABASE_USER'] = 'x'
app.config['MYSQL_DATABASE_PASSWORD'] = 'x'
app.config['MYSQL_DATABASE_DB'] = 'x'
app.config['MYSQL_DATABASE_HOST'] = 'x'
mysql.init_app(app)

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

@app.route('/login')
def login():
    return render_template('login.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']

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

            # All Good, let's call the MySQL

            conn = mysql.connect()
            cursor = conn.cursor()
            _hashed_password = generate_password_hash(_password)
            cursor.callproc('sp_createUser',(_name,_email,_hashed_password))
            data = cursor.fetchall()

            if len(data) is 0:
                conn.commit()
                return json.dumps({'message':'User created successfully !'})
            else:
                return json.dumps({'error':str(data[0])})
        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()
从flask导入flask,呈现_模板,json,请求
从flask.ext.mysqldb导入MySQL
从werkzeug导入生成密码散列,检查密码散列
app=烧瓶(名称)
mysql=mysql()
app.config['MYSQL\u DATABASE\u USER']='x'
app.config['MYSQL\u DATABASE\u PASSWORD']='x'
app.config['MYSQL\u DATABASE\u DB']='x'
app.config['MYSQL\u DATABASE\u HOST']='x'
mysql.init_应用程序(应用程序)
@应用程序路径(“/”)
def main():
返回渲染模板('index.html')
@app.route(“/login”)
def login():
返回呈现模板('login.html')
@应用程序路径(“/showSignUp”)
def showSignUp():
返回呈现模板('signup.html')
@app.route('/signUp',methods=['POST','GET'])
def signUp():
尝试:
_name=request.form['inputName']
_电子邮件=请求。表单['inputEmail']
_密码=请求。表单['inputPassword']
#验证接收到的值
如果名称、电子邮件和密码:
#好的,让我们打电话给MySQL
conn=mysql.connect()
游标=连接游标()
_哈希密码=生成密码哈希(\u密码)
callproc('sp_createUser',(\u名称,\u电子邮件,\u哈希密码))
data=cursor.fetchall()
如果len(数据)为0:
康涅狄格州提交
返回json.dumps({'message':'User created successfully!'})
其他:
返回json.dumps({'error':str(数据[0]))
其他:
返回json.dumps({'html':'Enter the required fields'})
例外情况除外,如e:
返回json.dumps({'error':str(e)})
最后:
cursor.close()
康涅狄格州关闭
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run()

我个人建议使用上下文管理器来处理光标和连接的打开和关闭。您可以相当简单地实现这一点,而且它更干净、更易于调试。这也将消除在巨型try-except块中打开连接或光标之前尝试关闭连接或光标的问题

from contextlib import closing

# do a bunch of stuff prior to opening connection
with closing(mysql.connect()) as conn:
    with closing(conn.cursor()) as cursor:
        # do a bunch of stuff and don't worry about running .close()
您可以查看
关闭的单据

使用
关闭
会将您的代码更改为以下内容。虽然它可以使用更多的重构,但这对于代码审查网站来说是一个问题

from flask import Flask, render_template, json, request
from flask.ext.mysqldb import MySQL
from werkzeug import generate_password_hash, check_password_hash
from contextlib import closing

app = Flask(__name__)
mysql = MySQL()


app.config['MYSQL_DATABASE_USER'] = 'x'
app.config['MYSQL_DATABASE_PASSWORD'] = 'x'
app.config['MYSQL_DATABASE_DB'] = 'x'
app.config['MYSQL_DATABASE_HOST'] = 'x'
mysql.init_app(app)

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

@app.route('/login')
def login():
    return render_template('login.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']

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

            # All Good, let's call the MySQL

            with closing(mysql.connect()) as conn:
                with closing(conn.cursor()) as cursor:
                    _hashed_password = generate_password_hash(_password)
                    cursor.callproc('sp_createUser',(_name,_email,_hashed_password))
                    data = cursor.fetchall()

                    if len(data) is 0:
                        conn.commit()
                        return json.dumps({'message':'User created successfully !'})
                    else:
                        return json.dumps({'error':str(data[0])})
        else:
            return json.dumps({'html':'<span>Enter the required fields</span>'})

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

if __name__ == '__main__':
    app.run()
从flask导入flask,呈现_模板,json,请求
从flask.ext.mysqldb导入MySQL
从werkzeug导入生成密码散列,检查密码散列
从上下文库导入关闭
app=烧瓶(名称)
mysql=mysql()
app.config['MYSQL\u DATABASE\u USER']='x'
app.config['MYSQL\u DATABASE\u PASSWORD']='x'
app.config['MYSQL\u DATABASE\u DB']='x'
app.config['MYSQL\u DATABASE\u HOST']='x'
mysql.init_应用程序(应用程序)
@应用程序路径(“/”)
def main():
返回渲染模板('index.html')
@app.route(“/login”)
def login():
返回呈现模板('login.html')
@应用程序路径(“/showSignUp”)
def showSignUp():
返回呈现模板('signup.html')
@app.route('/signUp',methods=['POST','GET'])
def signUp():
尝试:
_name=request.form['inputName']
_电子邮件=请求。表单['inputEmail']
_密码=请求。表单['inputPassword']
#验证接收到的值
如果名称、电子邮件和密码:
#好的,让我们打电话给MySQL
关闭(mysql.connect())作为连接:
以关闭(连接光标())作为光标:
_哈希密码=生成密码哈希(\u密码)
callproc('sp_createUser',(\u名称,\u电子邮件,\u哈希密码))
data=cursor.fetchall()
如果len(数据)为0:
康涅狄格州提交
返回json.dumps({'message':'User created successfully!'})
其他:
返回json.dumps({'error':str(数据[0]))
其他:
返回json.dumps({'html':'Enter the required fields'})
例外情况除外,如e:
返回json.dumps({'error':str(e)})
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run()

您仅在检查表单值的if块内定义
conn
cursor
。如果未输入块,则不会定义它们,但仍会尝试引用它们以关闭它们。如果您已经定义了这两个选项,则只能对它们调用
close
。将
conn=
cursor=
移动到if块之前,或将
close
调用移动到块内

然而,更大的问题是您误解了/过于复杂了如何使用MySQLdb。它将自动创建连接,并在请求完成时关闭连接,这也会关闭光标。只需使用中所述的扩展即可


所以我删除我的finally代码,直到if名称,并用注释之间的代码替换它,然后导入上下文库?是的,删除finally语句并导入该库,然后将opens更改为with语句,你应该很好。啊,我明白了。我以前从未使用过flask,但我熟悉纯python中的手动DB连接。@JasonMartinez,切换到django.。)+1为comedy@electrometro我想了一会儿,但我花了太多时间在视频上,研究如何使用Python和flask,我拒绝放弃。虽然最终我可能会。
...
cur = mysql.connection.cursor()
cur.callproc('sp_createUser', (name, email, hashed_password))
data = cur.fetchall()
...