2011-02-04 105 views
2

首先,如果已經提出這個問題,請不要開槍 - 我已經環顧四周,但無濟於事。python可變函數定義

我有一個python文件(名爲rpc.py)包含許多功能服務於AJAX請求。例如:

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

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

,它被稱爲其網址如下:

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。相反,找到一個理智的方法來做到這一點 – 2011-02-05 00:00:27

+1

我很欣賞你的迴應,但我的解決方案不僅僅是觀察。 – khany 2011-02-05 09:11:08

回答

6

您可以使用

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

,但我也建議添加前綴到服務的名稱(如「do_test」),以避免惡意代碼將能夠調用任何服務器的方法只需傳遞他們的名字(包括你認爲不應該包含的名字)。在這種情況下,它將是

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