如何解决获取 cursor.close() UnboundLocalError:调用 /api/view/addmin 时在赋值错误之前引用了局部变量“cursor”
这是我遇到错误的代码。使用 sqlAlchemy 实现了相同的操作,但是当我在 MysqL 中编写它时,我遇到了错误。
import pyMysqL
from functools import wraps
import jwt
import uuid
import datetime
from werkzeug.security import generate_password_hash,check_password_hash
from app import app
from config import MysqL
from flask import jsonify
from flask import flash,request
app.config['SECRET_KEY']='confidential'
def token_required(f):
@wraps(f)
def decorated(*args,**kwargs):
token= None
if 'x-acess-token' in request.headers:
token=request.headers['x-acess-token']
if not token:
return jsonify("token not found")
try:
data=jwt.decode(token,app.config['SECRET_KEY'])
conn=MysqL.connect()
cursor=conn.cursor(pyMysqL.cursors.DictCursor)
cursor.execute('select * from hireme_emp where id=%s',data['id'])
current_user=cursor.fetchone()
except:
return jsonify('invalid token')
finally:
cursor.close()
conn.close()
return f(current_user,*args,**kwargs)
return decorated
#-----------------------------------------------
app.route('/api/view/addmin')
@token_required
def view_addmin(current_user):
try:
conn=MysqL.connect()
cursor=conn.cursor(pyMysqL.cursors.DictCursor)
cursor.execute("SELECT * FROM hireme_emp WHERE admin=1")
rows=cursor.fetchall()
resp=jsonify(rows)
resp.status_code=200
return resp
except Exception as e:
print(e)
finally:
cursor.close()
conn.close()
这是我在没有令牌的情况下运行此端点时的代码,然后它给出“未找到令牌”消息,但是当我发送令牌时,它显示此错误,即(
ERROR :line 30,in decorated
cursor.close()
UnboundLocalError: local variable 'cursor' referenced before assignment
127.0.0.1 - - [23/Jul/2021 01:08:53] "GET /api/view/addmin HTTP/1.1" 500 -.
实际上下面的代码使用 sqlAlchemy 执行相同的工作并且正在工作。我只是想用纯 MysqL 重写这段代码,但我不明白我哪里出错了。预先感谢您的帮助
def token_required(f):
@wraps(f)
def decorated(*args,**kwargs):
token = None
if 'x-access-token' in request.headers:
token = request.headers['x-access-token']
if not token:
return jsonify({'message' : 'Token is missing!'}),401
try:
data = jwt.decode(token,app.config['SECRET_KEY'])
current_user = User.query.filter_by(public_id=data['public_id']).first()
except:
return jsonify({'message' : 'Token is invalid!'}),401
return f(current_user,**kwargs)
return decorated
解决方法
在开始 try catch 之前定义 conn 和 cursor
进一步您的工作代码显示您使用的是 public_id 而不是 id
我还将代码 cursor.execute 更改为元组
def token_required(f):
@wraps(f)
def decorated(*args,**kwargs):
token= None
if 'x-acess-token' in request.headers:
token=request.headers['x-acess-token']
if not token:
return jsonify("token not found")
conn=mysql.connect()
cursor=conn.cursor(pymysql.cursors.DictCursor)
try:
data=jwt.decode(token,app.config['SECRET_KEY'])
cursor.execute('select * from hireme_emp where id=%s LIMIT 1',(data['public_id'],))
current_user=cursor.fetchone()
except:
return jsonify('invalid token')
finally:
cursor.close()
conn.close()
return f(current_user,*args,**kwargs)
return decorated
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。