我问另一个问题python flask how to pass a dynamic parameter to a decorator,我得到了答案。
我现在正在使用flask,并使用flask-restful api,这将非常容易构建restful api 我的代码就像这样。
class ShopCategoryListAPI(Resource):
#@redis_hash_shop(shop_id=LocalProxy(lambda: shop_id))
@redis_hash_shop(shop_id)
def get_shop(self, shop_id):
return Shop.query.get(shop_id)
def get(self, shop_id):
shop = self.get_shop(shop_id)
pass
我想在从mysql查询商店之前将shop_id
传递给装饰器,这是我的装饰演示。
def redis_hash_shop(shop_id):
def fn_wrapper(fn):
def decorated_function(*args, **kwargs):
key = 'shop:{}'.format(shop_id)
if redis_store.exists(key):
return redis_store.hgetall(key)
else:
shop = fn(*args, **kwargs)
pass
return decorated_function
return fn_wrapper
它只是一个演示,它将在从mysql查询之前以redis获取商店信息。
我去了错误。它告诉我们Unresolved reference error
任何知道如何解决问题的人?提前谢谢。
答案 0 :(得分:0)
您看到的错误是因为shop_id
在使用时不是范围内的名称。 Python函数装饰器基本上将定义的函数传递给装饰器函数,并将结果分配回原始名称;所以
@redis_hash_shop(shop_id)
def get_shop(self, shop_id):
return Shop.query.get(shop_id)
与:
相同def get_shop(self, shop_id):
return Shop.query.get(shop_id)
fn_wrapper = redis_hash_shop(shop_id)
get_shop = fn_wrapper(get_shop)
错误Unresolved reference 'shop_id'
告诉您确切的错误:shop_id
在使用之前未定义。函数的参数不能用作函数装饰器的参数,因为当函数定义时,Python无法知道函数将被调用,只有当它是时称为