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

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

Я пытаюсь дать 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 ответ

Решение

Ваша проблема в том, что вы смешиваете два разных подхода: 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.

Другие вопросы по тегам