Разработка CGI скрипта с использованием метода parse() модуля cgi
Для получения доступа к данным, переданным браузером из HTML-формы клиента серверу, можно воспользоваться методом parse () модуля cgi, все параметры которого имеют значения, заданные по умолчанию. Для параметра keep_blank_values такое значение равно 0, что означает, что незаполненные поля HTML-формы сервером не будут обрабатываться (см. подраздел 3.2).
Поскольку предполагается, что пользователь в поле ввода имени свое имя может не указывать, то для обработки этого поля в любом варианте (заполненном и незаполненном), необходимо при вызове метода parse () явно задать значение параметра keep_blank_values (остальные параметры имеют значения, заданные по умолчанию):
form=cgi.parse(keep_blank_values=1)
Этот метод возвращает данные HTML-формы, полученные сервером, в виде словаря form, ключами которого являются имена полей формы (заданные атрибутами name), а значения полей формы представлены в виде списков. Причем поля HTML-формы, заданные тегом <input>, которые имеют одиночные значения, являются одноэлемнтными списками, поля, которые могут иметь множественное значение (например, тег <select> с атрибутом multiple), являются списками с несколькими элементами.
Поэтому доступ к значениям полей HTML-формы можно получить следующим образом:
· для одиночного значения, например, поля с именем name:
data=form["name"][0]
· для k-го значения поля с множественными значенниями, например, тега <select> с именем sel:
data=form["sel"][k]
Серверная программа после приема и обработки данных формирует ответ в виде HTML-документа, который отсылается клиенту и воспроизводится браузером на стороне клиента в виде Web-страницы. Для упрощения форматирования текста были разработаны следующие форматы представления данных в виде констант языка Python:
|
|
· для заголовка :
H= "<p >"
print (H, ' Формат "H" заголовка ' )
Формат "H" заголовка
· для другого заголовка:
H2= "<p >"
print (H2, 'Формат "H2" заголовка' )
Формат "H2" заголовка
· для текста
D= "<p >"
print (D, ' Текстовые данные ' )
Формат текстовых данных
Поскольку эти константы могут быть использованы разными программами при форматировании данных, отсылаемых клиенту, они помещены в модуль my_mod, который реализован в виде файла my_mod.py.
В качестве примера использования метода parse() модуля cgi для доступа к данным HTML-формы рассмотрим приложение, клиенткая часть которого реализована в виде примера №1, а серверная – в виде CGI скрипта cgi_parse_form.py:
#!c:/ . . . /Python/Python35-32/python.exe
print ( "Content-Type: text/html" )
print ()
import cgi, cgitb
from os import environ as env
from my_mod import *
HELP={ 'str' : 'строки: s=\'Python\'' ,
'list' : 'списка: a_list=[255,"web",1.33,True]' ,
'tuple' : 'кортежа: a_tuple=(\'name\',100)' ,
'set' : 'множества: a_set={1,2,\'a\',\'b\'}' ,
'dict' : 'словаря: a_dict={\'name\':\'Bob\',\'sport\':\'football\'}' }
cgitb.enable(logdir= "D:/ . . . Apache Group/Apache/root/Python/TMP/", context=7)
form=cgi.parse(keep_blank_values=1)
name= 'клиент'
if form[ 'name' ][0]: name=form[ 'name' ][0]
print (H2, "Ув. " ,name, "!" , sep= "" )
if "check1" in form or "check2" in form or "check3" in form or "help" in form:
print ( 'Вам предоставляются:' )
if 'check1' in form:
print (H, "Данные HTML-формы:" )
print (D, form)
if 'check2' in form:
print (H, "Переменные окружения:" )
print (D, 'REQUEST_METHOD= ' , env[ 'REQUEST_METHOD' ])
print (D, 'QUERY_STRING= ' , env[ 'QUERY_STRING' ])
print (D, 'HTTP_USER_AGENT= ' , env[ 'HTTP_USER_AGENT' ])
if 'check3' in form:
print (H, "Рисунки:" )
print (H, "<img src='everest.jpg'>" )
print (H, "<img src='flower.jpg'>" )
if 'help' in form:
print (H, "Примеры создания:" )
for el in form[ 'help' ]:
print (D, HELP[el])
else : print ( 'Вы действительно ничего не хотите заказать?' ),
|
|
которая выполняет следующие действия:
· в первых строках указывает путь к интерпретатору языка Python 3.3 и формирует http-заголовок (см. раздел 3);
· подключает модули языка Python (cgi, cgitb и os), а также пользовательский модуль my_mod, который содержит форматы для представления данных, отсылаемых клиенту;
· инициализирует обработчик ошибок, указывая следующие параметры вывода диагностической информации:
§ данные выводить на экран (значение по умолчанию) и одновременно сохранять в виде файла в каталоге TMP (путь к нему задается параметром logdir);
|
|
§ фрагмент скрипта, включающий строку с отмеченной ошибкой, составляет 7 строк;
· получает с помощью метода parse(keep_blank_values=1) модуля cgi в виде словаря данные HTML-формы (включая незаполненные поля), переданные клиентом;
· обращается к пользователю по имени, например, "Ув. Smith T." (если имя не было введено, то вместо имени используется слово "клиент"), сообщает об предоставлении данных (если они были заказаны):
"Ув. Smith T.! Вам предоставляются: "
и передает требуемые данные;
· если был передан запрос на получение данных HTML-формы, переданных серверу (например, с целью проверки правильности обмена данными между клиентом и сервером), то клиенту передается содержимое словаря form:
Данные HTML-формы:
{'name': [''], 'check2': ['on'], 'check3': ['img'], 'help': ['str', 'list', 'set', 'dict'], 'check1': ['data']}
из которого следует, что в HTML-форме клиента не было заполнено только два поля: "name" тега <input> и "tuple" тега <select> (см. раздел 2 );
· если был передан запрос на получение переменных окружения, то клиенту передаются значения следующих переменных окружения: "REQUEST_METHOD", "QUERY_STRING" и "HTTP_USER_AGENT":
Переменные окружения :
REQUEST_METHOD= GET
|
|
QUERY_STRING= name=Smith+T.&check1=request&check2=on&check3=img
HTTP_USER_AGENT= Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko;
Значения переменных окружения были получены с помощью свойства environ модуля os, в котором содержатся значения переменных окружения в виде пар "имя:значение". Например, значение QUERY_STRING может быть определено и передано следующим образом:
>>> from os import environ as env
>>> print (env[ 'QUERY_STRING' ]).
Использование модуля os для работы с файловой системой см. в подразделе 1.4 лаб. раб. №8;
· если был передан запрос на получение рисунков, то клиенту передаются рисунки "everest.jpg" и 'flower.jpg';
· если был передан запрос на получение подсказки по формированию данных следующих типов: строки, списка, кортежа, множества или словаря, то клиенту передаются примеры создания данных запрашиваемых типов. Наример, списка и словаря:
Примеры формирования данных
Списки : a_list=[255,"web",1.33,True]
Словари : a_dict={{'name':'Ronaldo','sport':'football'}
· если клиент не заполнил ни одно поле HTML-формы, то ему сообщается:
"Ув. клиент! Вы действительно ничего не хотите заказать?"
Результаты работы программы cgi_parse_form.py, полученные при использовании браузеров Internet Explorer, Chrome, Firefox, Opera и Safari, показывают, что она правильно обрабатывает различные поля HTML-формы как с использованием латинских букв, так и при использовании кириллицы. Поэтому способ доступа к данным, переданным клиентом серверу, основанный на использовании метода cgi.parse (), является основным и будет в дальнейшем исиользоваться как при обработке данных HTML-формы, так и при передаче данных клиента с использованием технологии AJAX.
Индивидуальные задания
Разработать приложение на базе технологии "клиент-сервер". При этом клиентская часть передает на сервер имя пользователя и номера функций, а серверная часть, написанная на языке Python, выполняет эти функции и возвращает пользователю результат.
В задачи клиентской части входит: разработать HTML-документ, содержащий форму, обязательными элементами которой являются:
· текстовое поле для ввода имени пользователя;
· теги (<select> или <input type="checkbox">), заданные колонкой "Теги" табл. 1, которые позволяют сделать пользователю следующий выбор:
§ выполнять или не выполнять функцию первой группы;
§ выполнять или не выполнять функцию второй группы;
§ выполнять или не выполнять функцию третьей группы;
· кнопки для сброса данных формы и для передачи их на сервер.
Функции по группам делятся следующим образом:
· группа 1:
§ а) – найти сумму положительных чисел;
§ б) – найти сумму четных чисел;
§ в) – найти произведение чисел, взятых по абсолютной величине;
§ г) – найти среднее арифметическое чисел;
§ д) – найти произведение нечетных чисел.
· группа 2:
§ а) – найти минимальное число среди положительных чисел;
§ б) – найти максимальное число среди отрицательных чисел;
§ в) – найти минимальное число среди чисел, взятых по абсолютной величине.
· группа 3:
§ а) – выполнить сортировку чисел, взятых по абсолютной величине;
§ б) – выполнить сортировку чисел, взятых по модулю 3.
В задачи серверной части входит:
· разработка трех функций, заданных колонкой "Функции" табл. 1;
· генерация случайных чисел, их диапазон и количество заданы колонками "Диапазон" и "Количество" табл. 1);
· прием и анализ данных, полученных из формы с целью определения:
§ имени пользователя;
§ тех функций, которые надо выполнять;
· выполнение указанных функций над полученными случайными числами;
· формирование HTML-документа, в котором указаны случайные числа и результаты вычислений, и передача его пользователю.
Таблица 1 – Перечень индивидуальных заданий | |||||||
Номер | Теги | Случайные числа | Функции | ||||
Диапазон | Количество | Группа 1 | Группа 2 | Группа 3 | |||
1 | input | (-5, 5) | 10 | а) | а) | а) | |
2 | select | (-7, 21) | 20 | б) | б) | б) | |
3 | input | (-20, 5) | 7 | в) | в) | а) | |
4 | select | (-25, 40) | 22 | г) | а) | б) | |
5 | input | (-7, 12) | 8 | д) | б) | а) | |
6 | select | (-22, 15) | 21 | а) | в) | б) | |
7 | input | (-12, 31) | 40 | б) | а) | а) | |
8 | select | (-14, 8) | 8 | в) | б) | б) | |
9 | input | (-13, 20) | 50 | г) | в) | а) | |
10 | select | (-4, 3) | 12 | д) | а) | б) | |
11 | input | (-33, 44) | 16 | а) | б) | а) | |
12 | select | (-55, 66) | 33 | б) | в) | б) | |
13 | input | (-7, 5) | 14 | в) | а) | а) | |
14 | select | (-19, 28) | 50 | г) | б) | б) | |
15 | input | (-8, 5) | 7 | д) | в) | а) | |
16 | select | (-24, 26) | 36 | а) | а) | б) | |
17 | input | (-11, 9) | 19 | б) | б) | а) | |
18 | select | (-9, 3) | 13 | в) | в) | б) | |
19 | input | (-17, 42) | 39 | г) | а) | а) | |
20 | select | (-3, 3) | 11 | д) | б) | б) |
Дата добавления: 2021-11-30; просмотров: 17; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!