Добрый день. Я сейчас прохожу курс повышения квалификации - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?
|
Разработка Web-приложений
Модуль cgi
В Python имеется поддержка CGI в виде модуля cgi. Следующий пример показывает некоторые из его возможностей:
#!/usr/bin/python # -*- coding: cp1251 -*- import cgi, os # анализ запроса f = cgi.FieldStorage() if f.has_key("a"): a = f["a"].value else: a = "0" # обработка запроса b = str(int(a)+1) mytext = open(os.environ["SCRIPT_FILENAME"]).read() mytext_html = cgi.escape(mytext) # формирование ответа print """Content-Type: text/html <html><head><title>Решение примера: %(b)s = %(a)s + 1</title></head> <body> %(b)s <table width="80%%"><tr><td> <form action="me.cgi" method="GET"> <input type="text" name="a" value="0" size="6"> <input type="submit" name="b" value="Обработать"> </form></td></tr></table> <pre> %(mytext_html)s </pre> </body></html>""" % vars()
В этом примере к заданному в форме числу прибавляется 1. Кроме того, выводится исходный код самого сценария. Следует заметить, что для экранирования символов >, <, & использована функция cgi.escape(). Для формирования Web-страницы применена операция форматирования. В качестве словаря для выполнения подстановок использован словарь vars() со всеми локальными переменными. Знаки процента пришлось удвоить, чтобы они не интерпретировались командой форматирования. Стоит обратить внимание на то, как получено значение от пользователя. Объект FieldStorage "почти" словарь, с тем исключением, что для получения обычного значения нужно дополнительно посмотреть атрибут value. Дело в том, что в сценарий могут передаваться не только текстовые значения, но и файлы, а также множественные значения с одним и тем же именем.
В примере выше проверка на допустимость произведена при вызове функции int(): если было бы задано нечисловое значение, сценарий аварийно завершился, а пользователь увидел Internal Server Error.
После анализа входных данных можно выделить фазу их обработки. В этой части CGI-сценария вычисляются переменные для дальнейшего вывода. Здесь необходимо учитывать не только значения переданных переменных, но и факт их присутствия или отсутствия, так как это тоже может влиять на логику сценария.
И, наконец, фаза вывода готового объекта (текста, HTML-документа, изображения, мультимедиа-объекта и т.п.). Проще всего заранее подготовить шаблон страницы (или ее крупных частей), а потом просто заполнить содержимым из переменных.
В приведенных примерах имена появлялись в строке запроса только один раз. Некоторые формы порождают несколько значений для одного имени. Получить все значения можно с помощью метода getlist():
lst = form.getlist("fld")
Список lst будет содержать столько значений, сколько полей с именем fld получено из web-формы (он может быть и пустым, если ни одно поле с заданным именем не было заполнено).
В некоторых случаях необходимо передать на сервер файлы (сделать upload). Следующий пример и комментарий к нему помогут разобраться с этой задачей:
#!/usr/bin/env python import cgi form = cgi.FieldStorage() file_contents = "" if form.has_key("filename"): fileitem = form["filename"] if fileitem.file: file_contents = """<P>Содержимое переданного файла: <PRE>%s</PRE>""" % fileitem.file.read() print """Content-Type: text/html <HTML><HEAD><TITLE>Загрузка файла</TITLE></HEAD> <BODY><H1>Загрузка файла</H1> <P><FORM ENCTYPE="multipart/form-data" ACTION="getfile.cgi" METHOD="POST"> <br>Файл: <INPUT TYPE="file" NAME="filename"> <br><INPUT TYPE="submit" NAME="button" VALUE="Передать файл"> </FORM> %s </BODY></HTML>""" % file_contents
В начале следует рассмотреть web-форму, которая приведена в конце сценария: именно она будет выводиться пользователю при обращении по CGI-сценарию. Форма имеет поле типа file, которое в web-браузере представляется полоской ввода и кнопкой "Browse". Нажимая на кнопку "Browse", пользователь выбирает файл, доступный в ОС на его компьютере. После этого он может нажать кнопку "Передать файл" для передачи файла на сервер.
Для отладки CGI-сценария можно использовать модуль cgitb. При возникновении ошибки этот модуль выдаст красочную HTML-страницу с указанием места возбуждения исключения. В начале отлаживаемого сценария нужно поставить
import cgitb cgitb.enable(1)
Или, если не нужно показывать ошибки в браузере:
import cgitb cgitb.enable(0, logdir="/tmp")
Только необходимо помнить, что следует убрать эти строки, когда сценарий будет отлажен, так как он выдает кусочки кода сценария. Это может быть использовано злоумышленниками, с тем чтобы найти уязвимости в CGI-сценарии или подсмотреть пароли (если таковые присутствуют в сценарии).