- CGI: пишем простой сайт на Python. Часть 1: Hello world
- Настройка локального сервера
- Hello world
- CGI: пишем простой сайт на Python. Часть 2: Обработка форм, cookies
- Получение данных из форм
- Но есть нюанс.
- Cookies
- Обработка Cookies
- Python 3. Программирование в Python – CGI
- Что такое CGI?
- Веб-браузер
- Архитектурная схема CGI
- Поддержка и настройка веб-сервера
- Первая программа CGI
- Привет, Мир! Это моя первая программа CGI
- Заголовок HTTP
- Переменные среды CGI
- Методы GET и POST
- Передача информации с использованием метода GET
- Передача информации с использованием метода POST
- Передача контрольных данных в программу CGI
- Передача данных с помощью кнопки радио в программу CGI
- Передача данных текстовой области в программу CGI
- Передача данных Drop Down Box в программу CGI
- Использование файлов cookie в CGI
- Как это работает?
- Настройка файлов cookie
- Получение файлов cookie
- Пример загрузки файлов
- Как вызвать диалоговое окно «Загрузка файла»?
CGI: пишем простой сайт на Python. Часть 1: Hello world
Проще всего создать динамические страницы на Python при помощи CGI-скриптов. CGI-скрипты — это исполняемые файлы, которые выполняются веб-сервером, когда в URL запрашивается соответствующий скрипт.
Сегодня я расскажу про то, как написать Hello world, как CGI-скрипт.
Настройка локального сервера
В Python уже есть встроенный CGI сервер, поэтому его настройка элементарна.
Для запуска из консоли (для любителей linux-систем). Запускать нужно из той папки, где мы хотим работать:
Для сидящих на Windows чуть проще будет запуск Python файла (заметьте, что он должен находиться в той же папке, в которой мы планируем работать!):
Теперь откройте браузер и в адресной строке наберите localhost:8000
Если у вас примерно такая же картина, значит, у вас все заработало!
Hello world
Теперь в той папке, где мы запустили сервер, создаём папку cgi-bin (у меня она уже создана).
В этой папке создаём скрипт hello.py со следующим содержимым:
Первая строка говорит о том, что это Python скрипт (CGI-скрипты можно не только на Python писать).
Вторая строка печатает заголовок. Он обозначает, что это будет html файл (бывает ещё css, javascript, pdf и куча других, и браузер различает их по заголовкам).
Третья строка (просто символ новой строки) отделяет заголовки от тела ответа.
Четвёртая печатает Hello world.
Теперь переходим на localhost:8000/cgi-bin/hello.py
Если у вас не работает, проверьте, установлены ли права на выполнение.
Также в консоли запущенного сервера появляются сообщения об ошибках. Например, убрал скобочку и обновил страницу:
В следующей части мы рассмотрим обработку данных форм и cookies.
CGI: пишем простой сайт на Python. Часть 2: Обработка форм, cookies
В первой части мы написали Hello world. Сегодня мы рассмотрим несколько более сложные вещи: обработку данных форм и cookies.
Получение данных из форм
Итак, во-первых разберёмся с формами. В модуле CGI есть полезный класс: FieldStorage, который содержит в себе переданную в форме информацию. По сути дела этот класс представляет из себя словарь, обладающий теми же свойствами, что и обычный словарь в python.
У класса FieldStorage есть 2 метода получения значений данных формы:
FieldStorage.getfirst(name, default=None) — всегда возвращает только одно значение, связанное с именем поля формы. Метод возвращает только первое значение в том случае, если нехороший пользователь послал более одного значения. Обратите внимание, что порядок, в котором будут получены значения, могут отличаться от браузера к браузеру. Если нет такого поля формы или значение не существует, то метод возвращает default.
FieldStorage.getlist(name) — возвращает список значений, связанных с именем поля формы.
Разберём на примере: создадим в нашей папке файл index.html со следующим содержимым (это будет наша форма, данные из которой мы будем обрабатывать):
А в папке cgi-bin/ — файл form.py (обработчик формы)
Попробуем это в действии (кто сидит на linux, не забудьте поставить права на выполнение).
Но есть нюанс.
А если попробовать так?
Это серьёзная уязвимость, поэтому от неё нужно избавляться. Для этого нужно (в самом простом случае) экранировать все опасные символы. Это можно сделать с помощью функции escape из модуля html.
Результат можете проверить сами.
Вообще говоря, экранирование нежелательных символов везде, где нужно — очень большая проблема безопасности веб-приложений. Помните об этом.
Cookies
Cookies (печеньки) — небольшой фрагмент данных, отправленный веб-сервером и сохраняемый на компьютере пользователя. Браузер всякий раз при попытке открыть страницу соответствующего сайта пересылает этот фрагмент данных веб-серверу в составе HTTP-запроса.
Собственно, cookies — хороший способ сохранить некоторые данные о пользователях.
Отправка печенек осуществляется заголовком Set-cookie:
Например, если сохранить этот скрипт в /cgi-bin/cookie.py и зайти на localhost:8000/cgi-bin/cookie.py, то вам поставится печенька с именем name и значением value. Срок её хранения до мая 2033 года, отправляется повторно на сервер только к скриптам, которые расположены в /cgi-bin/, и передается только http-запросами (её нельзя получить из браузера пользователя с помощью javascript).
Все эти параметры не являются обязательными. Можно написать так:
Тогда храниться она будет до того момента, когда закроется браузер, будет отправляться на сервер для любых документов (и для /index.html тоже, в отличие от предыдущего случая). Также её можно будет получить средствами javascript (поскольку не был установлен флаг httponly).
Обработка Cookies
Теперь научимся получать cookies. Они передаются на сервер и доступны в переменной os.environ (словарь, cookies хранятся по ключу HTTP_COOKIE). Они передаются в виде пар ключ=значение, что не очень удобно при обработке. Для упрощения работы можно использовать модуль http.cookies.
Напишем простой скрипт (/cgi-bin/cookie.py), проверяющий, установлена ли кука, и если нет, устанавливает:
Так страница выглядит после первого запроса:
И после обновления страницы:
Не следует хранить в cookies важные данные, и не полагайтесь на выставленный вами срок хранения. Cookies можно удалить или изменить вручную в браузере.
Python 3. Программирование в Python – CGI
Что такое CGI?
Common Gateway Interface или CGI является стандартом для внешних шлюзовых программ для взаимодействия с информационными серверами, такими как HTTP-серверы.
Веб-браузер
Чтобы понять концепцию CGI, давайте посмотрим, что происходит, когда мы нажимаем на гипер ссылку для просмотра определенной веб-страницы или URL-адреса.
- Ваш браузер связывается с веб-сервером HTTP и запрашивает URL-адрес, то есть имя файла.
- Веб-сервер анализирует URL-адрес и ищет имя файла. Если он обнаружит, что файл отправляет его обратно в браузер, в противном случае отправляется сообщение об ошибке, указывающее, что вы запросили неправильный файл.
- Веб-браузер получает ответ от веб-сервера и отображает либо полученный файл, либо сообщение об ошибке.
Тем не менее, можно настроить HTTP-сервер так, чтобы всякий раз, когда запрашивается файл в определенном каталоге, этот файл не отправляется обратно; вместо этого он выполняется как программа, и все эти выходы программы отправляются обратно для отображения вашего браузера. Эта функция называется интерфейсом общего шлюза или CGI, а программы называются скриптами CGI. Эти CGI-программы могут быть Python Script, PERL Script, Shell Script, C или C ++ программой и т. д.
Архитектурная схема CGI
Поддержка и настройка веб-сервера
Прежде чем приступать к программированию CGI, убедитесь, что ваш веб-сервер поддерживает CGI, и он настроен для обработки программ CGI. Все программы CGI, которые будут выполняться HTTP-сервером, хранятся в предварительно сконфигурированной директории. Этот каталог называется CGI Directory, и по соглашению он называется как/var/www/cgi-bin. По соглашению, файлы CGI имеют расширение как. cgi, но вы также можете сохранить свои файлы с расширением python .py.
По умолчанию сервер Linux настроен на запуск только скриптов в каталоге cgi-bin в/var/www. Если вы хотите указать любой другой каталог для запуска ваших CGI-скриптов, прокомментируйте следующие строки в файле httpd.conf:
Здесь мы предполагаем, что у вас есть веб-сервер и он работает успешно, и вы можете запускать любую другую программу CGI, такую как Perl или Shell, и т. д.
Первая программа CGI
Вот простая ссылка, которая связана с CGI-скриптом hello.py . Этот файл хранится в каталоге/var/www/cgi-bin и имеет следующий контент. Перед запуском программы CGI убедитесь, что у вас есть режим изменения файла, используя команду chmod 755 hello.py в UNIX, чтобы сделать исполняемый файл.
Если вы нажмете hello.py, то это даст следующий результат:
Привет, Мир! Это моя первая программа CGI
Этот скрипт hello.py: это простой скрипт Python, который записывает свой вывод в файл STDOUT, т. е. на экран. Существует одна важная и дополнительная функция, которая является первой строкой для печати. Content-type: text/html\r\n\r\n . Эта строка отправляется обратно в браузер и указывает тип содержимого, отображаемый на экране браузера.
К настоящему времени вы, должно быть, поняли базовую концепцию CGI, и вы можете написать много сложных программ CGI, используя Python. Этот скрипт может взаимодействовать с любой другой внешней системой также для обмена информацией, такой как РСУБД.
Заголовок HTTP
Строка Content-type: text/html\r\n\r\n является частью HTTP-заголовка, который отправляется в браузер для понимания содержимого. Весь HTTP-заголовок будет выглядеть следующим образом:
Существует несколько других важных HTTP-заголовков, которые вы часто будете использовать в своем программировании CGI.
№ | Заголовок и описание |
---|---|
1 | Content-type: Строка MIME, определяющая формат возвращаемого файла. Пример Content-type: text/html |
2 | СExpires: Date Дата, когда информация становится недействительной. Он используется браузером, чтобы решить, когда страница нуждается в обновлении. Действительная строка даты находится в формате 01 января 1998 года 12:00:00 GMT. |
3 | Location: URL URL-адрес, который возвращается вместо запрашиваемого URL-адреса. Вы можете использовать это поле для перенаправления запроса в любой файл. |
4 | Last-modified: Date Дата последней модификации ресурса. |
5 | Content-length: N Длина в байтах возвращаемых данных. Браузер использует это значение для сообщения о предполагаемом времени загрузки файла. |
6 | Set-Cookie: String Установка cookie, проходящий через строку |
Переменные среды CGI
Все программы CGI имеют доступ к следующим переменным среды. Эти переменные играют важную роль при написании любой программы CGI.
№ | Имя переменной и описание |
---|---|
1 | CONTENT_TYPE Тип данных содержимого. Используется, когда клиент отправляет прикрепленный контент на сервер. Например, загрузка файла. |
2 | CONTENT_LENGTH Длина информации запроса. Он доступен только для запросов POST. |
3 | HTTP_COOKIE Возвращает набор файлов cookie в виде пары ключ и значение. |
4 | HTTP_USER_AGENT Поле заголовка запроса пользователя-агента содержит информацию о пользовательском агенте, инициирующем запрос. Это имя веб-браузера. |
5 | PATH_INFO Путь к скрипту CGI. |
6 | QUERY_STRING URL-кодированная информация, которая отправляется с запросом метода GET. |
7 | REMOTE_ADDR IP-адрес удаленного хоста, делающего запрос. Это полезно для ведения журнала или для аутентификации. |
8 | REMOTE_HOST Полноценное имя хоста, делающего запрос. Если эта информация недоступна, REMOTE_ADDR можно использовать для получения IR-адреса. |
9 | REQUEST_METHOD Метод, используемый для выполнения запроса. Наиболее распространенными методами являются GET и POST. |
10 | SCRIPT_FILENAME Полный путь к скрипту CGI. |
11 | SCRIPT_NAME Имя скрипта CGI. |
12 | SERVER_NAME Имя хоста сервера или IP-адрес |
13 | SERVER_SOFTWARE Имя и версия программного обеспечения, на котором запущен сервер. |
Вот небольшая программа CGI для перечисления всех переменных CGI. Нажмите эту ссылку, чтобы увидеть результат Get Environment
Методы GET и POST
Вы должны столкнуться со многими ситуациями, когда вам нужно передать некоторую информацию из своего браузера на веб-сервер и, в конечном счете, в свою программу CGI. Чаще всего браузер использует два метода, которые передают эту информацию на веб-сервер. Этими методами являются метод GET и метод POST.
Передача информации с использованием метода GET
Метод GET отправляет закодированную пользовательскую информацию, добавленную к запросу страницы. Страница и закодированная информация разделяются символом ? следующим образом:
Метод GET является методом по умолчанию для передачи информации от браузера к веб-серверу и создает длинную строку, которая отображается в поле «Location» вашего браузера. Никогда не используйте метод GET, если у вас есть пароль или другая конфиденциальная информация для передачи на сервер. Метод GET имеет ограничение по размеру: в строке запроса может быть отправлено только 1024 символа. Метод GET отправляет информацию с использованием заголовка QUERY_STRING и будет доступен в вашей программе CGI через переменную окружения QUERY_STRING.
Вы можете передавать информацию, просто конкатенируя пары ключей и значений вместе с любым URL-адресом, или вы можете использовать теги HTML
В фактическом выводе вышеуказанной формы, вы вводите Имя и Фамилию, а затем нажмите кнопку «Отправить», чтобы увидеть результат.
Передача информации с использованием метода POST
Обычно более надежным способом передачи информации в программу CGI является метод POST. Он упаковывает информацию точно так же, как метод GET, но вместо отправки ее в виде текстовой строки после ? в URL-адресе он отправляет его как отдельное сообщение. Это сообщение входит в CGI-скрипт в виде стандартного ввода.
Ниже приведен такой же скрипт hello_get.py, который обрабатывает GET, а также метод POST.
Возьмем опять тот же пример, что и выше, который передает два значения, используя кнопку HTML FORM и кнопку отправки. Для обработки этого ввода мы используем тот же скрипт CGI hello_get.py.
Вот фактический вывод вышеуказанной формы. Введите первое и последнее имя и нажмите кнопку «Отправить», чтобы увидеть результат.
Передача контрольных данных в программу CGI
Флажки используются, когда требуется выбрать более одного параметра.
Вот пример кода HTML для формы с двумя флажками:
Ниже приведен флажок checkbox.cgi для обработки ввода, заданного веб-браузером, для кнопки флажка.
Передача данных с помощью кнопки радио в программу CGI
Кнопки «Радио» используются, когда требуется выбрать только один параметр.
Вот пример кода HTML для формы с двумя переключателями:
Ниже приведен сценарий radioobutton.py для обработки ввода, заданного веб-браузером для переключателя:
Передача данных текстовой области в программу CGI
Элемент TEXTAREA используется, когда многострочный текст должен быть передан в программу CGI.
Вот пример кода HTML для формы с полем TEXTAREA:
Ниже приведен скрипт textarea.cgi для обработки ввода, заданного веб-браузером:
Передача данных Drop Down Box в программу CGI
Drop Down Box используется, когда у нас есть много доступных опций, но будет выбран только один или два.
Вот пример кода HTML для формы с одним выпадающим списком:
Ниже приведен сценарий dropdown.py для обработки ввода, заданного веб-браузером.
Использование файлов cookie в CGI
Протокол HTTP: это протокол без учета состояния. Для коммерческого веб-сайта необходимо поддерживать информацию о сеансе между различными страницами. Например, одна регистрация пользователя заканчивается после завершения многих страниц. Как сохранить информацию о сеансе пользователя на всех веб-страницах?
Во многих ситуациях использование файлов куки – является наиболее эффективным методом запоминания и отслеживания предпочтений, покупок, комиссий и другой информации, необходимой для лучшего опыта посетителей или статистики сайта.
Как это работает?
Ваш сервер отправляет некоторые данные в браузер посетителя в виде файла cookie. Браузер может принять cookie. Если это так, оно хранится как простая текстовая запись на жестком диске посетителя. Теперь, когда посетитель прибывает на другую страницу вашего сайта, cookie доступен для извлечения. После получения ваш сервер знает/запоминает, что было сохранено.
Файлы cookie представляют собой запись текстовых данных из 5 полей переменной длины:
- Expires – дата истечения срока действия файла cookie. Если это пустое, cookie истечет, когда посетитель покинет браузер.
- Domain – доменное имя вашего сайта.
- Path – путь к каталогу или веб-странице, которая устанавливает cookie. Это может быть пустым, если вы хотите получить файл cookie из любого каталога или страницы.
- Secure – если это поле содержит слово «secure», то файл cookie может быть получен только с защищенного сервера. Если это поле пустое, таких ограничений не существует.
- Name=Value – Cookies устанавливаются и извлекаются в виде пар ключей и значений.
Настройка файлов cookie
Очень легко отправлять файлы cookie в браузер. Эти файлы cookie отправляются вместе с заголовком HTTP до заголовка Content-type. Предполагая, что вы хотите установить UserID и Password как файлы cookie. Настройка файлов cookie выполняется следующим образом:
В этом примере вы должны понимать, как устанавливать файлы cookie. Мы используем HTTP-заголовок Set-Cookie для установки файлов cookie.
Не обязательно устанавливать атрибуты cookie, такие как Expires, Domain и Path. Примечательно, что файлы cookie устанавливаются перед отправкой магической строки «Content-type: text/html\r\n\r\n.
Получение файлов cookie
Очень легко получить все установленные файлы cookie. Файлы cookie хранятся в переменной среды CGI HTTP_COOKIE, и они будут иметь следующую форму:
Ниже приведен пример извлечения файлов cookie.
Это дает следующий результат для файлов cookie, установленных вышеуказанным скриптом:
Пример загрузки файлов
Чтобы загрузить файл, форма HTML должна иметь атрибут enctype, установленный для multipart/form-data. Тег ввода с типом файла создает кнопку «Обзор».
Вышеприведенный пример был заблокирован намеренно для сохранения людей, загружающих файл на наш сервер, но вы можете попробовать код выше с вашим сервером.
Вот сценарий save_file.py для обработки загрузки файлов:
Если вы запустите вышеупомянутый скрипт в Unix/Linux, вам нужно позаботиться о замене разделителя файлов следующим образом, в противном случае на вашей машине windows выше Open() оператор должен работать нормально.
Как вызвать диалоговое окно «Загрузка файла»?
Иногда желательно, чтобы вы предоставили возможность, когда пользователь может щелкнуть ссылку, и она отобразит диалоговое окно «Загрузка файла» пользователю вместо отображения фактического содержимого. Это очень просто и может быть достигнуто через HTTP-заголовок. Этот HTTP-заголовок отличается от заголовка, упомянутого в предыдущем разделе.
Например, если вы хотите сделать файл FileName загружаемым из данной ссылки, то его синтаксис выглядит следующим образом:
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.