【问题标题】:python flask API module how to pass a dynamic parameter to a decoratorpython flask API模块如何将动态参数传递给装饰器
【发布时间】:2017-12-13 18:04:21
【问题描述】:

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

只是一个demo,会先在redis中获取店铺信息,然后再从mysql查询。

我犯了错误。它告诉我们Unresolved reference error

谁知道如何解决这个问题?提前致谢。

【问题讨论】:

  • shop_id 需要在函数/装饰器之外定义。
  • @wmorrell 我用的是flask-Restful,不能在函数外定义shop_id,这里有一个demo,flask-restful.readthedocs.io/en/0.3.5/…
  • 你使用 PyCharm 吗?
  • @lapinkoira 是的,PyCharm

标签: python flask redis python-decorators


【解决方案1】:

您看到的错误是因为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 无法知道函数在 defined 时调用的函数,只有在 时才知道叫

【讨论】:

    猜你喜欢
    • 2017-12-13
    • 1970-01-01
    • 2021-04-09
    • 2011-02-22
    • 2016-02-14
    • 2020-04-13
    • 2014-11-17
    • 2018-12-04
    相关资源
    最近更新 更多