2016-03-20 24 views
0

FlaskのPOSTリクエストで呼び出されたpython 2.7関数に辞書を渡すにはどうすればいいですか?URLから派生したものではありませんが、私のスクリプト、例えばFlask経由で呼び出された関数にdictを渡す

@app.route('/url_route', methods=['POST']) 
def my_function(foo, bar): 
    baz = foo + bar # both are 'internal' variables, e.g. not via POST 

    (do other stuff with inbound data from POST request) 

    return baz, other stuff 

私はエラーを取得するPOSTリクエストを経由して試してみて、トリガは、my_function:

my_function() takes exactly 2 arguments (0 given) 

私は、例えば、それらの両方のグローバルを宣言することでこれを避けることができ知っています

def my_function(foo, bar): 
    global foo 
    global bar 

    baz = foo + bar 

Bu私には他の選択肢がありますか?

+0

これらの変数はどこに定義されていますか? – Suever

+3

これは貧弱なデザインの匂いがします。あなたは少しズームアウトして、これらの変数が何であるか、そしてなぜ彼らがこの外に住んでいるのかを教えてください。 – Suever

+0

変数は、 'if name = __main__'の直後のグローバル名前空間で最初に定義された一対の辞書です。このスクリプトは、ユーザーがデータファイルをアップロードするHTMLフロントエンドをサポートしています。これにより、my_function以外のいくつかの関数呼び出しによっていくつかの中間的な分析ステップが実行され、一連の結果がPOSTリクエストによって返されます。辞書(ここではfooとbar)は、入力、中間ステップからの出力、アップロードされた最終結果を格納します。 – pniessen

答えて

1

定数の場合、IMOグローバルはOKです。

値を生成するためにいくつかのコードを実行する必要がある場合は、my_functionから呼び出せるメソッドを定義します(再利用する場合は別のモジュールに配置することもできます)。実際、定数の場合でも、単純な関数でそれらを抽象化することができます。あなたが例

のためのデータベース接続などのリソースをキャッシュする場合

def foo(): 
    # compute and return value 

def bar(): 
    # compute and return value 

def my_function():  
    baz = foo() + bar() 

また、フラスコ内のアプリケーション・コンテキストは、あなたのためにいくつかの使用であるかもしれません

編集元の質問

のコメントを読んだ後、あなたはおそらく、本当にキーと値のストアを使用する必要があり、多分にもフラスコセッションを考慮してください。 https://pythonhosted.org/Flask-Session/ は、そうでなければ、あなただけではなく、マルチスレッドの問題を取得します(することができます2つのワーカープロセスを実行するとすぐにマルチプロセスの問題も発生します.1つの要求では1つのプロセスでデータを保存できますが、次の要求は別のプロセスに格納される可能性があります。

あなたが本当に唯一のプロトタイプを作成するために、このをしたい場合は、私は、少なくとも抽象代わりに生の辞書をさらすのユーザーデータへのアクセスをあなたにお勧めしたいです。一つの簡単な方法でこのようなものです:

class FooStore(object): 

    FOO = {} 

    @classmethod 
    def get(cls, user_id): 
     return FOO.get(user_id) 

    @classmethod 
    def set(cls, user_id, value): 
     return cls.FOO[user_id] = value 

# Access/set the values 
FooStore.set(1, {'data': 'some user data'}) 
FooStore.get(1) 

後で、簡単にsetgetの実装を変更することができます。たとえば、シリアライズしてRedisに保存し、Redisからフェッチして逆シリアル化します。また、より簡単なテストが可能になります。

関連する問題