До сих пор мы вводили данные в текстовые поля. Но формы HTML поддерживают ряд элементов ввода (которые в традиционных графических интерфейсах мы называли виджетами) для получения данных, вводимых пользователем. Рассмотрим программу CGI, которая демонстрирует сразу все стандартные элементы для ввода. Как обычно, определим файл HTML для страницы формы и CGI-сценарий на языке Python для обработки введенных данных и создания ответной страницы. Файл HTML представлен в примере 15.11.
Пример 15.11. PP4E\Internet\Web\tutor5a.html
<HTML><TITLE>CGI 101</TITLE>
<BODY>
<H1>Common input devices</H1>
<HR>
<FORM method=POST action="cgi-bin/tutor5.py">
<H3>Please complete the following form and click Send</H3> <P><TABLE>
<TR>
<TH align=right>Name:
<TD><input type=text name=name>
<TR>
<TH align=right>Shoe size:
<TD><table>
<td><input type=radio name=shoesize value=small>Small
<TR>
<TH align=right>Occupation:
<TD><select name=job>
<option>Developer
<option>Manager
<option>Student
<option>Evangelist
<option>Other
</select>
<TR>
<TH align=right>Political affiliations:
<TD><table>
<td><input type=checkbox name=language value=Python>Pythonista
<td><input type=checkbox name=language value=Perl>Perlmonger
<td><input type=checkbox name=language value=Tcl>Tcler
</table>
<TR>
<TH align=right>Comments:
<TD><textarea name=comment cols=30 rows=2>
Enter text here</textarea>
<TR>
<TD colspan=2 align=center>
<input type=submit value="Send">
</TABLE>
</FORM>
<HR>
</BODY></HTML>
При отображении в броузере появляется страница, изображенная на рис. 15.13
Как и прежде, эта страница содержит обычное текстовое поле, а также переключатели, окно раскрывающегося списка, группу флажков для выбора нескольких вариантов и область ввода многострочного текста. Для всех них в файле HTML задан параметр name, идентифицирующий выбранное ими значение в данных, отправляемых клиентом серверу. Если заполнить эту форму и щелкнуть на кнопке отправки Send (Передать), на сервере будет запущен сценарий из примера 15.12, который обработает все входные данных, введенные с клавиатуры или выбранные на форме.
Пример 15.12. PP4E\Internet\Web\cgi-bin\tutor5.py
#!/usr/bin/python
выполняется на стороне сервера, читает данные формы, выводит разметку HTML
import cgi, sys
form = cgi.FieldStorage() # извлечь данные из формы
print("Content-type: text/html") # плюс пустая строка
html = """
<TITLE>tutor5.py</TITLE>
<H1>Greetings</H1>
<HR>
<H4>Your name is %(name)s</H4>
<H4>You wear rather %(shoesize)s shoes</H4>
<H4>Your current job: %(job)s</H4>
<H4>You program in %(language)s</H4>
<H4>You also said:</H4>
<P>%(comment)s</P>
<HR>"""
data = {}
for field in (‘name’, ‘shoesize’, ‘job’, ‘language’, ‘comment’) if not field in form:
data[field] = ‘(unknown)’
else:
if not isinstance(form[field], list):
data[field] = form[field].value
else:
values = [x.value for x in form[field]]
data[field] = ‘ and ‘.join(values)
print(html % data)
Рис. 15.13. Страница формы ввода, генерируемая файлом tutor5a.html
Этот сценарий Python не очень сложен; в основном он просто копирует данные из полей формы в словарь с именем data, чтобы их можно было легко вставить в заключенную в тройные кавычки строку ответа. Стоит пояснить некоторые использованные приемы:
Проверка правильности полей
Как обычно, необходимо проверить все ожидаемые поля ввода и убедиться в их присутствии во входных данных с помощью оператора in словарей. Некоторые или все поля ввода могут отсутствовать, если на форме в них не были введены данные или они не были добавлены в строку адреса URL.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011