python flask API模块如何将动态参数传递给装饰器

时间:2017-07-10 05:58:25

标签: python flask redis python-decorators

我问另一个问题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

任何知道如何解决问题的人?提前谢谢。

enter image description here

1 个答案:

答案 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无法知道函数将被调用,只有当它是时称为