Разработка 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!