Теперь возьмем что-нибудь более реальное. В большинстве CGI-приложений на страницах с формами ввода присутствуют несколько полей. Когда полей больше одного, метки и поля для ввода обычно располагаются в виде таблицы, чтобы придать форме структурированный внешний вид. Файл HTML в примере 15.9 определяет форму с двумя полями ввода.
Пример 15.9. PP4E\Internet\Web\tutor4.html
<html>
<title>CGI 101</title>
<H1>A second user interaction: tables
</H1>
<hr>
<form method=POST action="cgi-bin/tutor4.py">
<table>
<TR>
< TH align=right>Enter your name:
<TD><input type=text name=user>
<TR>
< TH align=right>Enter your age:
<TD><input type=text name=age>
<TR>
< TD colspan=2 align=center>
<input type=submit value="Send">
</table>
</form>
</body></html>
Тег <TH> определяет колонку, как и <TD>, но также помечает ее как колонку заголовка, что обычно означает вывод ее полужирным шрифтом. Размещая поля ввода и метки в такой таблице, получаем страницу ввода, изображенную на рис. 15.10. Метки и поля ввода автоматически выравниваются по вертикали в колонках подобно тому, как это обеспечивалось менеджерами компоновки графического интерфейса из библиотеки tkinter, с которыми мы встречались ранее в этой книге.
Рис. 15.10. Форма, скомпонованная с помощью тегов таблиц
При нажатии кнопки отправки на этой форме (с надписью Send (Передать)) на сервере будет запущен сценарий из примера 15.10 со входными данными, введенными пользователем.
Пример 15.10. PP4E\Internet\Web\cgi-bin\tutor4.py
#!/usr/bin/python """
выполняется на стороне сервера, читает данные формы, выводит разметку HTML;
URL http://server-name/cgi-bin/tutor4.py
import cgi, sys
sys.stderr = sys.stdout # для вывода сообщений
# об ошибках в броузере
form = cgi.FieldStorage() # извлечь данные из формы
print(‘Content-type: text/html\n’) # плюс пустая строка
# class dummy:
# def __init__(self, s): self.value = s
# form = {‘user’: dummy(‘bob’), ‘age’:dummy(’10’)}
html = """
<TITLE>tutor4.py</TITLE>
<H1>Greetings</H1>
<HR>
<H4>%s</H4>
<H4>%s</H4>
<H4>%s</H4>
<HR>"""
if not ‘user’ in form:
line1 = ‘Who are you?’
else:
line1 = ‘Hello, %s.’ % form[‘user’].value
line2 = "You’re talking to a %s server." % sys.platform
line3 = ""
if ‘age’ in form:
try:
line3 = "Your age squared is %d!" % (int(form[‘age’].value) ** 2) except:
line3 = "Sorry, I can’t compute %s ** 2." % form[‘age’].value
print(html % (line1, line2, line3))
Табличная структура определяется файлом HTML, а не этим CGI-сценарием на языке Python. На самом деле в этом сценарии не так много нового — как и прежде, с помощью операторов форматирования входные значения вставляются в строку шаблона с разметкой HTML ответа, заключенную в тройные кавычки, но на этот раз для каждого поля ввода выводится отдельная строка. Когда этот сценарий будет запущен в результате операции отправки формы ввода, он выведет новую страницу ответа, изображенную на рис. 15.11.
Рис. 15.11. Страница ответа, сгенерированная сценарием tutor4.py
Как обычно, мы можем передавать параметры этому CGI-сценарию в конце URL. На рис. 15.12 изображена страница, полученная при явной передаче имени и возраста пользователя в следующем адресе URL:
http://localhost/cgi-bin/tutor4.py?user=Joe+Blow&age=30
Рис. 15.12. Страница, сгенерированная при обращении к сценарию tutor4.py с параметрами в URL
Обратите внимание, что на этот раз за символом ? следуют два параметра; они отделяются друг от друга символом &. Кроме того, обратите внимание, что в значении параметра user мы определили пробел с помощью символа +. Это обычное соглашение по кодированию адресов URL. На стороне сервера символ + автоматически будет замещен пробелом. Кроме того, это одно из стандартных правил экранирования строк URL, которые мы рассмотрим позднее. И хотя пример 15.10 не содержит ничего особенно нового для сценариев CGI, тем не менее, он высвечивает несколько новых приемов программирования, имеющих отношение к отладке и безопасности сценариев CGI. Давайте кратко рассмотрим их.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011