2017-07-10 11 views
0

私は別の質問をしますpython flask how to pass a dynamic parameter to a decorator、私は答えを得ました。python flask 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 

私は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

+0

'shop_id'を関数/デコレータの外で定義する必要があります。 – wmorrell

+0

@wmorrell私はフラスコを使用しています。安静で、関数の外でshop_idを定義することはできません。ここにデモがあります。http://flask-restful.readthedocs.io/en/0.3.5/quickstart.html#resourceful-routing – diligent

+0

あなたはPyCharmを使いますか? – lapinkoira

答えて

0

shop_idは、それが使用された時点でスコープ内の名前ではありませんので、あなたが見ているエラーです。 Python関数デコレータは、基本的に定義された関数をデコレータ関数に渡し、その結果を元の名前に戻します。それが使用される前に定義されていませんshop_idUnresolved reference '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) 

エラー:そう

@redis_hash_shop(shop_id) 
def get_shop(self, shop_id): 
    return Shop.query.get(shop_id) 

は同じです。関数のパラメータを関数デコレータのパラメータとして使用することはできません。の場合にのみ、と定義されているときに、関数が呼び出される関数をPythonが知る方法がないためです。

関連する問題