cgi.FieldStorage всегда пусто - никогда не возвращает отправленные данные формы - PullRequest
3 голосов
/ 06 мая 2010

Эта проблема, вероятно, смущающе проста.

Я пытаюсь раскрутить python. Я подумал, что хорошим способом начать это было бы создание простого сценария cgi для обработки некоторых данных формы и некоторой магии. Мой скрипт на python выполняется должным образом apache с использованием 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, он правильно сообщит данные формы. Страница Python всегда дает мне один и тот же результат: количество ключей: 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

Я использую Python 2.5.2 и Apache / 2.2.3. Это то, что находится в моем файле apache conf (а мой скрипт в / var / www / python):

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

1 Ответ

6 голосов
/ 06 мая 2010

Ваша проблема в том, что вы смешиваете два разных подхода: CGI и mod_python. Вы объявляете свой сценарий издателем mod_python, поэтому вызывается его метод index, что также делает его модулем, а не сценарием.

Если бы вы использовали CGI, вы бы удалили директивы mod_python из вашей конфигурации Apache, просто оставьте ExecCGI и либо переименуйте скрипт, чтобы иметь расширение .cgi, либо установите обработчик для расширения .py, чтобы он был CGI. , также. Тогда ваш скрипт будет выполнен как скрипт, а это значит, что функция index, которую вы определили в вашем скрипте, не будет выполнена, если вы не вызовете ее с верхнего уровня скрипта.

Как я помню - но я уже давно не обращаю внимания на mod_python - если вы хотите вместо этого использовать mod_python, вам следует использовать mod_python.util.FieldStorage вместо cgi.FieldStorage для доступа к данным POST.

Все это говорит о том, что намного лучший выбор для простых веб-материалов - WSGI , например, через mod_wsgi . И, как правило, лучшим выбором, чем обычные веб-ресурсы, является использование веб-фреймворка, например Django , TurboGears , Pylons или одного из множества других, перечисленных в например, страница веб-фреймворков на wiki.python.org

...