【问题标题】:Name 'string' is not defined in decorator in Python FlaskPython Flask 的装饰器中未定义名称“字符串”
【发布时间】:2018-06-26 07:26:35
【问题描述】:

我是 Flask 编程的初学者,我有这段代码,我想将标头标记与装饰器函数中名为 key 的字符串进行比较。 代码如下:

def require_appkey(view_function):
    @wraps(view_function)

    def decorated_function(*args, **kwargs):
        try:  
            if request.headers.get('auth') and request.headers.get('auth') == key:
                    return view_function(*args, **kwargs)
            else:
                return {'status' : 'success', 'message' : 'auth failed'}
        except Exception as e:
            x = str(e)
            x.replace('\n', '')
            return {'status' : 'failed', 'message' : str(x)}
    return decorated_function

要在上面装饰器的键中分配一个值,这是我的示例代码。

class AuthenticateUser(Resource):
    def post(self):
        try:
            global key
            conn = None
            parser = reqparse.RequestParser()
            parser.add_argument('username', type=str)
            parser.add_argument('password', type=str)
            args = parser.parse_args()

            _user = args['username']
            _userPassword = args['password']

            m = hashlib.md5(_userPassword.encode())
            conn = psycopg2.connect(database='salestracking', user='postgres', password='postgres')
            cursor = conn.cursor()
            cursor.execute('SELECT count(*) FROM tbl_user WHERE username = %s AND password = %s', (_user,m.hexdigest(), ))


            data = [dict(((cursor.description[i][0]), value)
                for i, value in enumerate(row)) for row in cursor.fetchall()]

            x = data[0]['count']

            if(x == 1):
                cursor = conn.cursor()
                cursor.execute('SELECT  userID, userlevel, employeeID, username FROM tbl_user WHERE username = %s AND password = %s;', (_user, m.hexdigest(), ))
                data = [dict(((cursor.description[i][0]), value)
                    for i, value in enumerate(row)) for row in cursor.fetchall()]



                create_access = create_access_token(args['username'])
                data[0]['access_token'] = create_access 
                data[0]['status'] = 'success'
                data[0]['message'] = 'success'

                key = data[0]['access_token']

                print(key)
                cursor.close()

                return data[0]


            else:
                cursor.close()
                return {'status' : 'success', 'message' : 'failed'}


        except Exception as e:
            x = str(e)
            x.replace('\n', '')
            return {'status' : 'failed', 'message' : str(x)}
        finally:
            if conn is not None:
                conn.close()

但是当我运行它时

class CreateUser(Resource):
    @require_appkey
    def post(self):

错误返回“未定义名称'key'”。请帮我解决它。

【问题讨论】:

    标签: python-3.x api flask


    【解决方案1】:

    您必须在调用装饰函数CreateUser.post() 之前调用AuthenticateUser.post(),因此key 将在装饰函数调用时定义。

    考虑这个代码示例:

    from functools import wraps
    
    def my_dec(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            print(key)
            return f(*args, **kwargs)
        return wrapper
    
    class AuthenticateUser(object):
        def post(self):
            global key
            key = 'foo'
    
    class CreateUser(object):
        @my_dec
        def post(self):
            pass
    

    输出:

    In [1]: from app import AuthenticateUser, CreateUser
    In [2]: CreateUser().post()
    ---------------------------------------------------------------------------
    Traceback (most recent call last) <ipython-input-2-78b387fcad49> in <module>()
    ----> 1 CreateUser().post()
    
    /home/user/projects/so/app.py in wrapper(*args, **kwargs)
          5     @wraps(f)
          6     def wrapper(*args, **kwargs):
    ----> 7         print(key)
          8         return f(*args, **kwargs)
          9     return wrapper
    NameError: global name 'key' is not defined
    
    In [3]: AuthenticateUser().post()
    In [4]: CreateUser().post()
    foo
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-05
      • 2020-07-15
      • 2018-10-11
      • 2012-06-17
      • 1970-01-01
      • 2023-01-21
      • 2021-10-04
      • 2014-02-16
      相关资源
      最近更新 更多