sql >> データベース >  >> NoSQL >> Redis

Pythonフラスコ動的パラメータをデコレータに渡す方法

    フラスコアプリケーショングローバルのドキュメントを確認する場合、flask.g 、それは言う:

    ある関数から別の関数への1つの要求に対してのみ有効なデータを共有するには、スレッド環境で破損するため、グローバル変数は十分ではありません。 Flaskは特別なオブジェクトを提供します これにより、アクティブなリクエストに対してのみ有効になります リクエストごとに異なる値が返されます。

    これは、スレッドローカルプロキシ(flask/globals.py内)を使用して実現されます。 ):

    g = LocalProxy(partial(_lookup_app_object, 'g'))
    

    もう1つ覚えておくべきことは、Pythonは、リクエストまたはflaskの外部で、「コンパイル」フェーズ中にデコレータの最初のパスを実行しているということです。 応用。つまり、key 引数には、'shop_{}_style'.format(g.city.id)の値が割り当てられます flaskの外部で、アプリケーションが起動したとき(クラスが解析/装飾されているとき) リクエストコンテキスト。

    ただし、flask.gへのアクセスを簡単に遅らせることができます。 コールバック関数を介して、使用時にのみ値をフェッチするレイジープロキシを使用する。すでにflaskにバンドルされているものを使用しましょう 、werkzeug.local.LocalProxy

    from werkzeug.local import LocalProxy
    
    class ShopAreaAndStyleListAPI(Resource):
        @redis_hash_shop_style(key=LocalProxy(lambda: 'shop_{}_style'.format(g.city.id)))
        def get(self):
            # if not found from redis, query from mysql
            pass
    

    一般的に(flask以外の場合 または非werkzeug アプリ)、同様のLazyProxyを使用できます ProxyTypesから パッケージ。

    これとは関係なく、redis_hash_shop_styleも修正する必要があります redisからフェッチするだけでなくデコレータ 、ただし、ラップされたf()を呼び出すことにより、古い(または存在しない)場合は値を更新(または作成)します 必要に応じて。




    1. パス_idの値XXXのマングースエラーCasttoObjectIdが失敗したのは何ですか?

    2. 別々のnodeJSインスタンスでソケットを共有する

    3. mongoimportのインポートモード

    4. SQLで文字列内の文字列を検索する