Вернемся к программному коду. Настало время заняться чем-нибудь более полезным, чем примеры, что мы видели до сих пор (или хотя бы более увлекательным). В этом разделе представлена программа, демонстрирующая базовый синтаксис различных языков программирования, необходимый для вывода строки «Hello World», классической начальной программы.
Для простоты предполагается, что вывод строки будет производиться в стандартный поток вывода, а не в графический интерфейс или вебстраницу. Кроме того, будет показана лишь сама команда вывода, а не полная программа. Версия на языке Python оказывается при этом законченной программой, но мы здесь не ставим себе цели противопоставлять ее реализациям на конкурирующих языках.
Структурно этот пример в первом приближении состоит из файла HTML главной страницы и CGI-сценария на языке Python, запускаемого из формы на главной странице HTML. Поскольку здесь не требуется сохранять какую-либо информацию между переходами от страницы к странице, данный пример все еще достаточно прост. На самом деле главная страница HTML, представленная в примере 15.17, является просто одним большим раскрывающимся списком выбора, находящимся внутри формы.
Пример 15.17. PP4E\Internet\Web\languages.html
<html><title>Languages</title>
<body>
<h1>Hello World selector</h1>
<Р>Эта демонстрационная страница показывает, как выглядит вывод сообщения "hello world" на различных языках программирования. Для простоты этот пример показывает лишь команду вывода (чтобы создать законченную программу, на некоторых языках программирования требуется написать дополнительный программный код) и только простейшее решение, обеспечивающее вывод текста в консоль (без графического интерфейса или логики конструирования HTML). Эта страница представляет собой простой файл HTML; следующая страница, которая появится после щелчка на кнопке ниже, генерируется CGI-сценарием на языке Python, выполняющимся на сервере. Дополнительные указания:
<UL>
<Х1>Чтобы увидеть разметку HTML страницы, выберите пункт меню ‘View Source‘ (‘Исходный код страницы’ или ‘Просмотр HTML-кода’) в броузере.
<Х1>Что6ы увидеть исходный программный код Python сценария CGI, выполняющегося на сервере,
<A HREF="cgi-bin/languages-src.py">щелкните здесь</Д> или
<A HREF="cgi-bin/getfile.py?filename=cgi-bin\languages.py">здесь</A>.
<Х1>Что6ы увидеть альтернативную версию этой страницы, сгенерированную динамически,
<A HREF="cgi-bin/languages2.py">щелкните здесь</Д>.
</UL></P>
<hr>
<form method=POST action="cgi-bin/languages.py">
<P><B>Select a programming language:</B>
<P><select name=language>
<option>All
<option>Python
<option>Python2
<option>Perl
<option>Tcl
<option>Scheme
<option>SmallTalk
<option>Java
<option>C
<option>C++
<option>Basic
<option>Fortran
<option>Pascal
<option>Other
</select>
<P><input type=Submit>
</form>
</body></html>
Не будем пока обращать внимание на некоторые гиперссылки в середине этого файла — они ведут к более фундаментальным понятиям, таким как передача файлов и удобство сопровождения, которыми мы займемся в следующих двух разделах. При открытии этого файла HTML в броузере клиента выводится страница, представленная на рис. 15.21.
Виджет над кнопкой Submit Query (Отправить запрос) является раскрывающимся списком, позволяющим выбрать одно из значений тега <option> в файле HTML. Как обычно, выбрав название одного из языков и нажав кнопку Submit Query (Отправить запрос) внизу (или клавишу Enter), мы отправим название выбранного языка экземпляру программы сценария CGI на сервере, имя которой указано в параметре action формы. В примере 15.18 представлен сценарий Python, выполняемый на сервере в результате передачи.
![]() |
|
Пример 15.18. PP4E\Internet\Web\cgi-bin\languages.py
#!/usr/bin/python
демонстрирует синтаксис вывода сообщения ‘hello world‘ на выбранном языке программирования; обратите внимание, что в сценарии используются "сырые" строки вида r‘…’, чтобы исключить интерпретацию последовательностей символов ‘\n‘ в таблице, и к строкам применяется функция cgi.escape(), чтобы такие строки, как ‘<<‘, корректно интерпретировались броузером — они будут преобразованы в допустимый код разметки HTML; сценарию может быть передано название любого языка программирования, так как в броузере можно явно ввести полную строку URL вида "http://servername/cgi—bin/languages.py?language= Cobol" или передать ее из сценария (с помощью urllib.request.urlopen). предупреждение: список языков отображается в обеих версиях страницы, CGI и HTML, — его можно было бы импортировать из общего файла, если список выбора также генерируется сценарием CGI;
debugme = False # Тгие=параметр в виде аргумента командной строки inputkey = ‘language‘ # имя входного параметра
r" print(‘Hello World’)
r" print ‘Hello World’
r’ print "Hello World\n";
r’ puts "Hello World"
r’ (display "Hello World") (newline) r" ‘Hello World’ print.
r’ System.out.println("Hello World");
r’ printf("Hello World\n");
r’ cout << "Hello World" << endl;
r’ 10 PRINT "Hello World"
r" print *, ‘Hello World’
r" WriteLn(‘Hello World’);
class dummy: # имитация входного объекта
def __init__(self, str): self.value = str import cgi, sys if debugme:
form = {inputkey: dummy(sys.argv[1])} # имя в командной строке else:
form = cgi.FieldStorage() # разбор действительного ввода
print(‘Content-type: text/html\n’) # добавить пустую строку
print(‘<TITLE>Languages</TITLE>’)
print(‘<H1>Syntax</H1><HR>’)
def showHello(form): # разметка HTML для одного языка
choice = form[inputkey].value
print(‘<H3>%s</H3><P><PRE>’ % choice)
try:
print(cgi.escape(hellos[choice]))
except KeyError:
print("Sorry—I don’t know that language")
print(‘</PRE></P><BR>’)
if not inputkey in form or form[inputkey].value == ‘All’:
for lang in hellos.keys():
mock = {inputkey: dummy(lang)}
showHello(mock)
else:
showHello(form)
print(‘<HR>’)
Как обычно, этот сценарий выводит разметку HTML в стандартный поток вывода, чтобы создать страницу ответа в броузере клиента. В этом сценарии немного нового, о чем стоило бы рассказать, но в нем использованы некоторые приемы, заслуживающие особого внимания:
Не обра ба ты ваемые «сырые» стро ки и ка выч ки
Обратите внимание на использование не обра ба ты вае мых строк (raw strings, константы строк, которым предшествует символ «r») в определении словаря языков. Напомню, что необрабатываемые строки сохраняют в строке символы обратного слэша \ как литералы, не интерпретируя их как начало экранированных последовательностей. Без этого последовательность символов перевода строки \n в фрагментах программного кода на некоторых языках воспринималась бы интерпретатором Python как перевод строки и не выводилась бы в разметке HTML ответа как \n. Здесь также используются двойные кавычки для строк, включающих неэкранированные символы апострофов, — обычное правило оформления литералов строк в языке Python.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011