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.