2010-05-06 2 views
3

이 문제는 당황스럽게 간단합니다.cgi.FieldStorage 항상 비어 있음 - 반환하지 않음 게시 된 양식 데이터

저는 파이썬에 대해 설명하려고합니다. 그 일을 시작하는 좋은 방법은 간단한 CGI 스크립트를 만들어 양식 데이터를 처리하고 마술을 부리는 것이라고 생각했습니다. 내 파이썬 스크립트는 mod_python을 사용하여 아파치에 의해 적절히 실행되고, 원하는대로 인쇄 할 것이다.

내 유일한 문제는 입니다. cgi.FieldStorage()는 항상 비어 있습니다.입니다. 나는 POST와 GET 둘 다 사용하여 시도했다. 각 시험판은 두 양식 필드를 모두 채 웁니다.

<form action="pythonScript.py" method="POST" name="ARGH"> 
<input name="TaskName" type="text" /> 
<input name="TaskNumber" type="text" /> 
<input type="submit" /> 
</form> 

내가 perl 스크립트를 가리 키도록 양식을 변경하면 양식 데이터가 올바르게보고됩니다. 파이썬 페이지는 항상 동일한 결과를 제공합니다 : 키의 수 : 0

#!/usr/bin/python 

    import cgi 

    def index(req): 

      pageContent = """<html><head><title>A page from""" 
      pageContent += """Python</title></head><body>""" 
      form = cgi.FieldStorage() 
      keys = form.keys() 
      keys.sort() 
      pageContent += "<br />number of keys: "+str(len(keys)) 
      for key in keys: 
        pageContent += fieldStorage[ key ].value 
      pageContent += """</body></html>""" 
      return pageContent 

저는 파이썬 2.5.2와 아파치 2.2.3을 사용하고 있습니다. 이것은 나의 아파치의 conf 파일에 (그리고 내 스크립트의/var/www /에서 파이썬에) 무엇을 : CGI와 mod_python을 :

<Directory /var/www/python/> 
     Options FollowSymLinks +ExecCGI 
     Order allow,deny 
     allow from all 
     AddHandler mod_python .py 
     PythonHandler mod_python.publisher 
    </Directory> 
+0

는 어떻게 제출하나요 같은 웹 프레임 워크를 사용한다? 귀하의 양식에 제출 버튼이 없습니다. – extraneon

+0

하 - 좋은 지적! 이 질문에 대한 양식을 단순화 할 때 부주의하게 제출을 삭제했습니다. 감사. –

답변

6

귀하의 문제는 두 개의 서로 다른 접근 방식을 혼합하고 있다는 점이다. 스크립트를 mod_python 게시자로 선언합니다. 그 이유는 index 메서드가 호출되는 이유이며 스크립트가 아닌 모듈이기도합니다.

당신은 CGI를 사용한 경우, 당신이 당신의 아파치 설정에서 mod_python의 지침을 제거 단지 ExecCGI를 떠나, 그리고 중 하나뿐만 아니라의 .cgi 확장이 있거나 .py 확장 CGI로의 핸들러를 설정하는 스크립트의 이름을 바꿀 것 . 그런 다음 스크립트는 스크립트로 실행됩니다. 즉, 스크립트에서 정의한 index 함수는 스크립트의 최상위에서 호출하지 않으면 실행되지 않습니다.

mod_python을 사용하기를 원했기 때문에 오랜 시간이 걸렸습니다. 대신 mod_python을 사용하려면 cgi.FieldStorage 대신 mod_python.util.FieldStorage을 사용하여 POST 데이터에 액세스해야합니다.

말했다 모든

, 베어 본 웹 물건에 대한 훨씬 더 나은 선택 mod_wsgi을 통해 예를 들어, WSGI입니다. 그리고 일반적으로 마른 사람 웹 물건보다 더 나은 선택은 Django, TurboGears, Pylons, 또는 예를 들어,에 나와있는 많은 사람들 중 하나 인 web frameworks page on wiki.python.org

+2

Thomas의 응답에 추가하여 mod_python.publisher를 사용하면 POST 데이터가 이미 req.form에 남아있는 FieldStorage 객체로 처리됩니다. index() 함수에서 인수를 수락하면 명명 된 양식 인수는 동일한 이름의 인수로 전달됩니다. 따라서 FieldStorage에 대해 전혀 걱정할 필요가 없습니다. 'http://webpython.codepoint.net/mod_python_publisher_form'을 참조하십시오. –

+0

고마워! 그것은 많은 의미가 있습니다. req.form에 양식 데이터를 저장하는 mod_python.publisher에 대한 세부 정보를 찾지 못했습니다. 정말 도움이되었습니다. 지금은 작은 실험을 위해 wsgi를 사용하는 것이 의미가 없지만 앞으로는 확실히 살펴 보겠습니다. 도와 주셔서 다시 한 번 감사드립니다! –

관련 문제