2016-01-22 67 views
-4

我试图创建一个简单的webapp。并在此期间从调试器中裁剪出上述错误。任何人都可以帮助我。其他一切正常工作,数据库服务器正常工作。但在这里无法找出问题。UnboundLocalError:赋值之前引用的局部变量'cursor'(第72行)

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

app = Flask(__name__) 

mysql = MySQL() 
app = Flask(__name__) 
app.secret_key = 'why would I tell you my secret key?' 

# MySQL configurations 
app.config['MYSQL_DATABASE_USER'] = 'root' 
app.config['MYSQL_DATABASE_PASSWORD'] = '' 
app.config['MYSQL_DATABASE_DB'] = 'mydata' 
app.config['MYSQL_DATABASE_HOST'] = 'localhost' 
mysql.init_app(app) 


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

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

@app.route('/userHome') 
def userHome(): 
    if session.get('user'): 
     return render_template('userHome.html') 
    else: 
     return render_template('error.html',error = 'Unauthorized Access') 


@app.route('/logout') 
def logout(): 
    session.pop('user',None) 
    return redirect('/') 


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



@app.route('/validateLogin', methods=['POST','GET']) 
def validateLogin(): 
    try: 
     _username = request.form['inputusername'] 
     _password = request.form['inputpassword'] 


     con = mysql.connect() 
     cursor = con.cursor() 
     cursor.callproc('sp_validateLogin',(_username,)) 
     data = cursor.fetchall() 

     if len(data) > 0: 
      if check_password_hash(str(data[0][4]),_password): 
       session['user'] = data[0][0] 
       return redirect('/userHome') 
      else: 
       return render_template('error.html',error = 'Wrong Email address or Password.') 
     else: 
      return render_template('error.html',error = 'Wrong Email address or Password.')    

    except Exception as e: 
     return render_template('error.html',error=str(e)) 
    finally: 
     cursor.close() 
     con.close()     

@app.route('/signUp', methods=['POST','GET']) 
def signUp(): 
    try: 
     # read the posted values from the UI 
     _name = request.form['inputfullname'] 
     _username = request.form['inputusername'] 
     _email = request.form['inputemail'] 
     _password = request.form['inputpassword']  


     # validate the received values 
     if _name and _username and _email and _password: 
      # All Good, let's call MySQL 

      conn = mysql.connect() 
      cursor = conn.cursor() 
      _hashed_password = generate_password_hash(_password) 
      cursor.callproc('sp_createUser', (_name,_username,_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.debug = True 
    app.run() 
+0

请确保您准确地发布了您的缩进,否则您的Python代码将毫无意义。 – khelwood

+0

哦!对不起,现在用正确的缩进重新编辑了这篇文章。 @khelwood –

+0

请[edit]包含[mcve]。 – davidism

回答

2

signup(),你finally块会尝试当try块在任何时候退出执行cursor.close()。在try块,cursor被分配在if

try: 
    ... 
    if _name and _username and _email and _password: 
     ... 
     cursor = conn.cursor() 
    ... 
finally: 
    cursor.close() 

如果没有输入if块,cursor将不会分配,但你的finally块仍试图调用cursor.close()

来解决这一问题将是确保cursor分配,并if检查cursor.close()线的最小变化。例如:

cursor = None 
try: 
    ... 
    if _name and _username and _email and _password: 
     ... 
     cursor = conn.cursor() 
    ... 
finally: 
    if cursor: 
     cursor.close() 

也许你会希望做同样的事情与conn变量。

或者您可以将try/finally块移动到仅在分配了cursor时才输入的位置。

+0

非常感谢。它的工作.. :) @ khelwood –

相关问题