2017-07-10 21 views
0

我問另一個問題python flask how to pass a dynamic parameter to a decorator,我得到了答案。蟒蛇燒瓶API模塊如何將一個動態參數傳遞給裝飾器

我現在正在使用燒瓶,並使用flask-restful api,這將很容易建立寧靜的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 

我想一個shop_id傳遞給裝飾之前,我從MySQL查詢店鋪,這裏是我的裝飾演示。

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

+0

'shop_id'需要在函數/裝飾器之外定義。 – wmorrell

+0

@wmorrell我正在使用flask-Restful,並且無法在函數外部定義shop_id,這裏有一個演示,http://flask-restful.readthedocs.io/en/0.3.5/quickstart.html#resourceful-routing – diligent

+0

你使用PyCharm嗎? – lapinkoira

回答

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無法知道函數將被調用的方式。