2011-02-04 5 views
2

먼저, 이미 물어 본다면 나를 쏘지 마라. 나는 주변을 둘러 보았지만 아무 소용이 없다.파이썬 가변 함수 정의

저는 AJAX 요청을 처리하는 많은 기능을 포함하고있는 파이썬 파일 (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

와우, 이것은 아마도 가장 불안한 것입니다. 서버에서 실행되도록 임의 코드를 전달할 수 있습니다 (쉽게 추가 할 수 있음). 절대로 평가판을 사용하지 마십시오. 대신, 그것을 할 정상적인 방법을 찾으십시오. –

+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 바르 = cgi.FieldStorage() \t 서버 = 응답() \t 인쇄 "의 Content-Type : text/html과 \ n \ n " \t 프린트 getattr (서버, "do _"+ vars [ "fnc"]. 값) (vars) – khany