2011-02-04 16 views
2

これは既に尋ねられている場合は、まず私を撃ってはいけません - 私は周りを見回しましたが無駄です。Python変数の関数定義

私は、AJAXリクエストを処理する多くの機能を含むPythonファイル(rpc.py)を持っています。

def test(self, vars): 
    return vars['id'] 

def test2(self, vars): 
    return vars['id']+1 

そして、それは同じURLで呼ばれている:例えば

rpc.py?fnc=test2&id=4 

私は'fnc'クエリパラメータに一致する関数を呼び出すと'vars'に全体クエリ文字列を渡したいです。

したがって、次の「擬似コード」のようなものは、私が後だものです:

vars = cgi.FieldStorage() 
print "Content-Type: text/html\n\n" 
print eval('vars["fnc"].value(vars)') 

任意のアイデア?

+7

となります。これはおそらく最も安全性の低いものです。サーバー上で実行される任意のコードを(簡単に追加して)渡すことができます。決してevalを使用しないでください。代わりに、それを行うための元気な方法を見つける –

+1

私はあなたの応答を感謝しますが、私はちょうど観察よりも解決策の後でした。 – khany

答えて

6

あなたは

getattr(server, vars["fnc"])(vars) 

使用することができますが、私はまた、サーバーのメソッドを呼び出すことができるだろう悪意のあるコードを回避するために(例えば「do_test」)をサービス名にプレフィックスを追加することをお勧めしたいですあなたの名前を渡すだけでオブジェクトにすることができますこの場合、それは

getattr(server, "do_" + vars["fnc"])(vars) 
+1

ええ私はevalについての悪いことを聞いたことがあります。なぜなら、私はそれを使いたくないのですが(私はその悪い方法を完全には理解していませんが)、正確には「サーバ」ですか?私はエラーを受け取る "NameError:name 'server' not defined" – khany

+0

あなたの関数は 'self'パラメータを受け入れていたので、クラスのメソッドだと思っていました。そのクラスインスタンスを保持する変数を 'server'と呼びました。 – 6502

+0

それは動作します!ここに私の最終的なコード クラスの応答である: \tデフdo_test(自己、V): \t \tリターン "テスト" + STR(V [ 'ID']の値です。) \tデフdo_test2(自己、V): \t \tリターン "TEST2" __name__ == "__main__" の場合: \t VARS = cgi.FieldStorage() \tサーバー=応答() \t印刷「のContent-Type:text/htmlの\ nは\ n "getattr(server、 "do _" + vars ["fnc"]。value)(vars) – khany