Cgi — Избегание создание чистой страницы в CGI скрипте на Python


Содержание

This is my first CGI script

print » Hello, world! «

При этом учтите, что нельзя передавать заголовки после вывода текста или внутри него. Так что заголовки выводятся только вначале текста, иначе они считаются просто текстом! Наверное, Вам интересно знать об основной области применения CGI – для обработки информации из форм.

Итак передача параметров в CGI скрипт осуществляется двумя методами: прямой передачей параметров в имени URL в формате “http://адрес_скрипта?имя_параметра1=значение_параметра1&имя_параметра2=значение2. ”

при этом способе в программе становятся доступными переменные имя_параметра и им присваиваются переданные значения; второй способ состоит в передаче параметров через HTML форму. Во втором случае необходимо применение модуля CGI:

Затем, чтобы включить обработку ошибок полезно вставить в начало следующие строчки:

import cgitb; cgitb.enable()

Если же Вы не хотите, чтобы ошибки Вашего скрипта передавались в броузер клиента, а передавались в log файл, то сделайте следующее:

import cgitb; cgitb.enable(display=0, logdir=»/tmp»)

Итак, во-первых разберёмся с формами. В модуле CGI есть полезный класс: FieldStorage, который содержит в себе переданную в форме информацию. По сути дела этот класс представляет из себя словарь, обладающий теми же свойствами, что и обычный питоновский словарь, например методами has_key и key(), также можно определить его длину функцией len(). По умолчанию FieldStorage не содержит тех значений, которые в форме остались пустыми (например пустое поле ввода). Чтобы FieldStorage включал все переменные формы сделайте так:

Покажем пример работы с формой:

# Передали заголовки ранее

form = cgi.FieldStorage() #Здесь пустых значений нет!

if not (form.has_key(«name») and form.has_key(«addr»)): #А есть ли такие поля?

Error

print «Please fill in the name and addr fields.»

addr:», form[«addr»].value #Дальше обрабатываем форму

Учтите, если в форме присутствует несколько элементов с одним именем, то form.getvalue() вернёт список значений всех элементов с этим именем. Для того чтобы понять, элемент это или список удобно использовать функцию type. Как обычно, приведу пример:

from types import ListType

if isinstance(value, ListType):

# Или это просто переменная или полная лажа ;-)

Ну что ещё можно сказать? Хотел бы отметить использование File Upload если в форме есть переменная, представляющая собой файл, то при вызове form.getvalue() этот файл будет загружен из сети в память. Переменная же представляет собой обычный файл и его можно читать, используя методы модуля file:

# Это и вправду файл!

if not line: break

linecount = linecount + 1

Далее будут рассмотрены все методы модуля cgi, а пока ограничимся этим :-(

Зачем избегать CGI для Python с хостом LAMP?

Я использую PHP в течение многих лет. В последнее время я столкнулся с многочисленными сообщениями на форуме, в которых говорится, что PHP устарел, что современные языки программирования проще, безопаснее и т.д. И т.д.

Итак, я решил начать изучать Python. Поскольку я привык использовать PHP, я только начал создавать страницы, загрузив файл .htaccess с помощью

Затем мои образцы страниц выглядят так:

Это прекрасно работает. Но я столкнулся с комментарием в сообщении, в котором говорилось, что CGI не лучший способ использовать Python. Конечно, в нем не упоминалось, что является лучшим способом.

Почему использование CGI не лучший способ использовать Python? Какая альтернатива?

Есть ли какой-нибудь другой способ, чтобы создать простой сайт Python? Есть ли какая-то совершенно другая парадигма, которую я должен смотреть за пределами файлов .htaccess и .py?

Как выполнить Python CGI Script?

4 Niklas R [2011-06-15 01:42:00]

Я хочу выполнить CGI Python Script в пределах .shtml файл, но я просто не могу понять, как это сделать. Я уже нашел несколько способов?, но ничего не работало. И там было намного сложнее найти что-то, что на самом деле показывает, как выполнить script, а не как его написать!; /


Я очень новичок в CGI и любом Webstuff, но я программирую Python более полугода.

PS: Извините за запутанное форматирование кода, теперь я загрузил его на pastebin: S

//редактировать: Хорошо, теперь еще немного информации, потому что она по-прежнему не работает.

Из heliohost.org я был перенаправлен на http://area52.heliohost.org/cgi-bin/snakecharmer.py, где вы можете найти пути к интерпретаторам python.

Это моя структура папок:
— public_html -.htaccess — main.py — index.shtml

Теперь, щелкнув по ссылке, появляется «500 InternalServerError», и я не понимаю, почему.: (

Журнал ошибок сервера просто говорит об этом:

2 ответа

7 Решение gschoep [2012-01-24 07:26:00]

Вот что я написал некоторое время назад.

Есть несколько советов, как заставить Python работать в CGI.

Всегда просматривайте страницы через Apache. Обратите внимание, что просмотр файлов в файловой системе через браузер работает для большинства вещей на странице html, но не работает для CGI. Для работы скриптов они должны быть открыты через файловую систему htdocs. Адресная строка вашего браузера должна выглядеть так:

Если вы открываете файл через файловую систему, CGI не будет работать. Например, если это указано в строке местоположения вашего браузера:

Конвертировать конец строк сценариев в формат Unix: У большинства редакторов есть опции «show end of lines», а затем инструмент для конвертирования из Unix в формат ПК. У вас должен быть конец строк, установленных в формате Unix.

Укажите путь к интерпретатору Python в первой строке CGI script: У вас должна быть одна из следующих строк в качестве первой строки вашего CGI Python script:

Верхняя строка используется при отладке на ПК, а нижняя — для сервера, такого как 1 и 1. Я оставляю строки, как показано на рисунке, а затем редактирую их, как только они находятся на сервере, удалив первую строку.

Распечатайте тип содержимого, определяющий HTML, перед печатью любого другого результата: Это можно сделать, просто добавив следующую строку где-то очень рано в script:

Обратите внимание, что требуется 2 конца строк.

Настройка сценариев Python для предоставления отладочной информации: Импортируйте следующее, чтобы получить подробную информацию об отладке.

Альтернатива, если cgitb недоступна, заключается в следующем:

На сервере должны быть установлены полномочия python script для выполнения. После загрузки файлов обязательно отредактируйте первую строку и установите разрешения для файла.

Проверьте, можете ли вы напрямую нажать на python script. Если вы не можете, исправьте вышеуказанные шаги (2-6). Затем, когда Python script работает, отлаживайте shtml.

Cgi — Избегание создание чистой страницы в CGI скрипте на Python

Одна из няшних самых горячих тем сегодня — это «веб-приложения.» В отличие от традиционного «исполнимого» программного обеспечения, которое выполняется в определенном месте на настольном компьютере, веб приложение выполняется на централизованном сервере и предоставляет его возможности через Интернет, обычно через протокол HTTP и обычный веб-браузер. Веб приложения все более и более популярны, потому что они могут быть легоко доступны — просто введите URL в браузер — и приложение доступно одновременно целому ряду пользователей. Некоторые веб приложения обеспечивают электронную коммерцию (eBay), некоторые служат для развлечений (как например Yahoo! Games), и другие, как например Salesforce.com, управляют информацией предприятия.
В то время как Java, Perl, и PHP часто восхваляются как идеальные языки программирования для разработки веб приложений, возможности Python в этой области такие же. Действительно, Python отлично для создания динамического содержимого веб страниц.
Самый простой путь создания веб приложение на Python — использовать Common Gateway Interface (CGI). CGI — это протокол, который описывает, как соединить клиентов с веб приложениями.
Обычно, когда вы запрашиваете статическую страницу у веб-сервера, он находит файл, что вы запросили и посылает файл обратно в ответ. Например, запрос на http://www.example.com/contact.html возвращает страницу HTML contact.html. Однако, если запрос ссылается на сценарий CGI, то вместо возвращения сценария (его кода как содержимого), сценарий запускается и результат работы сценария присылается в ответ. Сценарии CGI генерируют содержимое динамически в ответ на запрос (и его параметры, как вы вскоре увидите).
Однажды поняв, как работает CGI, создание динамического содержимого становится простым использованием команды print. И в противоположность его репутации, CGI не обязательно медленен. Даже если интерпретатор Python запускается для каждого вызова сценария, рекомендуется попробовать CGI перед выбором более сложной веб структуры приложения.
Углубимся в программирование CGI на Python. Первая из двух частей объясняет основы CGI, описывает, как посылаются формы HTML и объясняет, как обработать введенные в форму данные.
Весь код в этой статье должен работать в Python 2.2 и более поздних версиях

Заголовки и концы строк
Половина работы при написания веб приложения — это возвращение правильных заголовков в ответ на запрос. Пересылка действительных заголовков важна не только для информации, которую получает клиент — если ваша программа не выдает действительных заголовков, веб-сервер предполагает, что ваш сценарий выполнился неуспешно и показывает устрашащую Ошибку 500. Внутренняя Ошибка Сервера.
Есть уйма различных заголовков, которые вы можете послать. Как минимум вы должны послать заголовок (фактически, во многих ситуациях это, возможно, является единственным заголовкмв, который вам нужно послать) Content-Type и вы должны завершить ваш список заголовков пустой линией.
Все заголовки выглядят как «тип_заголовка: имя_заголовока-значение\r\n». Однако, большинство клиентов и серверов позволяют лишь \n, то есть то, что вы получите в качестве нормального завершения строки на системах типа UNIX.
Hello World
Составим обязательную для новичков программу «Hello, World» как CGI скрипт:

Давайте пройдемся по коду.
Если вы запускаете сценарий CGI на системе Linux или Unix, вы должны включать обязательную линию (#!/usr/bin/python) «shebang» в строке 1, чтобы сказать сценарию, где найти Python.
Следующая часть сценария — это try/except блок, который пытается импортировать модуль cgitb. Обычно ошибки в программе на Python посылаются в sys.stderr. Однако, когда запускается CGI скрипт, sys.stderr транслирует в журнал регистрации ошибок сервера. Но постоянный поиск ошибок в журнале регистрации ошибок — это неудобно при отлаживании. Вместо этого cgitb выводит сообщения об ошибках, в том числе полезную информацию подобно значениям переменных, в браузер. (Этот модуль был только введен в Python 2.2.) Если импорт не удается, stderr присоединяется к stdout, который делает подобную, но не такую эффективную работу. (Не используйте модуль cgitb в производственных приложениях. Показываемая им информация включает детали о вашей системе, которая, возможно, полезна для возможного взломщика.)
Потом, cgiprint() выпускает две строки заголовков и должным образом завершает заголовки правильными окончаниями строк. (cgiprint() должна использоваться только для строк заголовков.) cgiprint() посылает заголовок Content-Type. Поскольку сценарий возвращает веб-страницу (которая является формой текста) тип/подтип заголовка — это text/html. Посылается только один заголовок, затем заголовки завершаются пустой строкой.
cgiprint() сбрасывает буфер выходного потока, используя sys.stdout.flush(). Большинство серверов буферизует выдачу сценариев, пока сценарий не завершен. Для сценариев, которые долго выполняются, буферизация выхода, возможно, расстроит вашего пользователя. Вы можете или регулярно сбрасывать ваш буфер, или запускать Python в небуферизованном режиме. Вариант командной строки: -u, который вы можете вставить как #!/usr/bin/python -u.
В конце концов, сценарий посылает маленькую страницу HTML, которая должна выглядеть знакомо, если вы использовали HTML до этого момента.
Пользовательский интерфейс и формы HTML
При написании CGI скриптов, ваш интерфейс пользователя — это веб-браузер. Объединеняя Javascript, Динамический HTML (DHTML) и HTML формы, вы можете создавать богатые возможностями веб приложения.
Основными элементами HTML, используемыми для общения с CGI скриптами, являются формы и элементы формы для пользовательского ввода, в том числе текстовые поля, радиокнопки, переключатели, меню и так далее.
Пример формы
Типичная, простая форма HTML, возможно, кодировалась бы подобно этому:

Цукерберг рекомендует:  Делаем меню в стиле лава-лампы

Когда пользователь нажимает кнопку Submit, данные из полей формы включается в запрос HTTP. Внутри тега form есть два параметра, которые определяют то, как происходит включение. Параметр action — это URI вашего сценария CGI, то есть куда направляется запрос. Параметр method конкретизирует, как значения кодируются в запросе. Два возможных метода — GET и POST.
Более простой — GET. При использовании GET значения формы кодируются, чтобы быть «URL безопасными» и добавляются в конец URL как список параметров. С POST кодируемые значения посылаются в теле запроса после того, как заголовки посланы.
GET проще, однако длина URL ограничена. Таким образом, использование GET навязывает максимальный ограничение для формы, которая может быть послана. (Около 1,000 символов — это ограничение многих серверов.) Если вы используете форму, чтобы получить длинный текстовый ввод из вашей формы, используйте POST. POST более подходит для запросов, где посылается больше данных.
Одно преимущество GET — то, что вы можете закодировать параметры для скрипта в нормальную ссылку HTML. Это означает, что параметры могут быть отправлены вашей программе без нажатия кнопки пользователем. Кодируемый набор значений выглядит примерно так:

param1=value1&param2=value+2&param3=value%263(Http GET запрос добавляет эту строку к URL.) Так что, целый URL, возможно, стал бы чем-нибудь вроде http://www.someserver.com/cgi-bin/test.py?param1=value1&param2=value+2&param3=value%26.
? отделяет URI вашего сценария от кодируемых параметров. Символы & отделяют параметры друг от друга. + представляет пространство (которое не нужно посылать как часть URI, конечно), и %26 — это кодируемое значение, которое представляет &. & не нужно посылать как часть значения, иначе CGI думал бы, что был послан новый параметр.
Если вы кодируете ваши собственные значения в URL, используйте функцию urllib.encode() от модуля urllib подобно этому:
value_dict = < 'param_1' : 'value1', 'param_2' : 'value2' >
encoded_params = urllib.encode(value_dict)
full_link = script_url + ‘?’ + encoded_params
Получение данных из форм
Формы HTML инкапсулированы в запросы так, что хорошо отображаются в тип данных «словарь» Python. Каждый элемент формы имеет имя и соответственное значение.
Например, если элемент — это радиокнопка, то посланное значение — это значение выбранной кнопки. Например, в предыдущей форме радиокнопка имеет имя param2 и ее значение есть или this, или that. Для переключателя, скажем param3 или param4, посланное значение есть off или on.
Теперь, когда вы знаете основы того, как формы кодируются и отправляются к CGI скриптам, настало время представить вам модуль cgi. Модуль cgi — это ваш механизм для получения данных из формы. Он делает процесс кодирования очень легким.
Чтение данных формы слегка осложняется двумя фактами. Для начала, имена входных элементов формы могут повторяться, так что значения могут быть списками. (Представьте себе форму, которая позволяет вам выбрать все правильные ответы.) Во-вторых, по умолчанию входной элемент, который не имеет никакого значения — как например текстовое поле, которое не заполнено — будет скорее отсутствовать, чем быть просто пустым.
Метод FieldStorage() модуля cgi возвращает объект, который представляет данные формы. Он — почти словарь. Вместо того, чтобы повторять страницу руководства об использовании модуля cgi, давайте помотрим на пару функций общего назначения, которые принимают объект, созданный FieldStorage() и возвращают словари.
Функции

Почти для всех CGI скриптов, которые получают входные данные от формы, вы будете знать, какие параметры ожидать. (В конце концов, вероятно вы сами и написали форму.) Если вы передаете функции getform() экзампляр FieldStorage() и список всех параметров, которые вы ожидаете получить, она возвращает словарь значений. Любые отсутствующие параметры имеют значение по умолчанию », если только вы не изменяли ключевое слово notpresent. Если вы хотите убедиться, что вы не получаете никаких списковых значений, установите ключевое слово nolist. Если переменная формы была списком, nolist возвращает только первое значение в списке.
Или, если вы хотите получить все значения, посланные формой, используйте функцию getall(). Она также принимает ключевое слово nolist как необязательный аргумент.
isblank() — это специальная функция: она проводит быструю проверку, чтобы определить все ли значения содержатся в словаре, возвращенном getall(), или getform() пуст. Если это так, CGI скрипт был вызван без параметров. В таком случае обычно генерируется страница приветствия и форма. Если словарь не пуст (isblank() возвращает False), форма содержит данные для обработки.
Использование getform()
Давайте обработаем данные из примера формы, описанной выше. Этой части программы нужны предыдущие функции и первые несколько строк программы Hello World.
import cgi

Давайте обсудим код. Есть три главных отрезка html: mainpage — это рамка страницы, которой только нужно тело для вставки внутрь нее. error показывается, если сценарий выл вызван без параметров. Однако, если сценарий вызван путем отправки формы, то параметры извлекаются и помещаются в result.
Сценарий печатает обязательные заголовки, а затем создает экземпляр FieldStorage, чтобы представить данные формы. Затем theform передается функции getform() наряду со списком ожидаемых параметров.
Если форма не была послана, то все значения в словаре, возвращенном getform() пусты (то есть »). В данном случае isblank() возвращает True и body установлена, чтобы быть сообщением об ошибке.
Если форма была послана, то isblank() возваращает False и значения из словаря извлекаются и вставляются в result. Переменная name содержит имя введенное в текстовое поле. Значение радиокнопки (в radio) или this, или that, в зависимости от того, какае значение было выбрано. check1 и check2 установлены в off или on в зависимости от того, были ли выбраны соответствующие переключатели. Скрытый параметр возвращается всегда.
Наконец страница напечатана, показывая или ошибку, или результаты. Легко или нет? Использование скрытых значений открывает возможность создания уникальных значений и кодирования их в форму. Это могло бы связать запросы вместе, так что вы можете динамически скроить содержимое для каждого пользователя, так как они проходят через ваше приложение (но это другая история).
Использование getall()
Если бы приложение было больше, возможно с несколькими формами, вы могли бы не знать заранее какие параметры будут введены. В таком случае вы можете использовать getall() вместо getform(). Тогда вы можете проверить существование определенных параметров и выполнить различные действия в зависимости от того, какая форма была отправлена:

Используя getall(), фактически вы можете переделать наш последний сценарий во что-нибудь немного более общее и полезное:
import cgi

Этот код получает все введенные параметры используя getall(). Затем он вставляет их в страницу как неопределенный список. Если вы посылаете этому сценарию форму, он показывает вам все полученные параметры на странице, где каждая строка выглядит как «параметр = значение». Поскольку строка кода, которая производит это, использует str() функция для каждого значения, она может справиться со списками.
Список значений
Различные параметры формы могут иметь одинаковые имена. В данном случае, значение, возвращенное в FieldStorage — это список. Вы могли бы использовать это для сбора информации от вашего пользователя. Например, список тем для информационных бюллетеней, которых вы, возможно, рассылаете.

программирование CGI Python

Что такое CGI

CGI в настоящее время поддерживается NCSA, NCSA CGI определяется следующим образом:

CGI (Common Gateway Interface), Common Gateway Interface, который является программа, работающая на сервере, например: HTTP-сервер, клиентский интерфейс обеспечивает такой же HTML-страницу.


просмотр веб-страниц

Чтобы лучше понять, как работает CGI, мы можем нажать на ссылку на веб-странице или URL процесса:

  • 1, использовать браузер для доступа к URL и подключиться к HTTP веб-сервер.
  • 2, Web-сервер получает сообщение с запросом будет анализироваться URL и посмотреть получил доступ к файлам на сервере, если есть, если есть, чтобы вернуть содержимое файла, в противном случае она возвращает сообщение об ошибке.
  • 3, браузер получает информацию с сервера и отображает полученный файл или сообщения об ошибках.

Программы CGI могут быть сценарий Python, Perl скрипт, скрипт SHELL, C или C ++ программ.

CGI Chart

Конфигурация сервера Web и поддержка

Перед тем, как проводить программирование CGI, убедитесь, что ваш веб-сервер был настроен для поддержки CGI и обработчик CGI.

Apache поддерживает конфигурацию CGI:

Настройка каталога CGI:

Все сервера HTTP для выполнения программы CGI сохраняются в предварительно сконфигурированной директории. Этот каталог называется каталог CGI, а также по соглашению, он называется / вар / WWW / CGI-BIN каталога.

CGI расширение файла .cgi, питон может также использовать .py расширение.

По умолчанию, конфигурация сервера Linux работает каталог CGI-BIN является / Var / WWW.

Если вы хотите указать другой каталог для запуска CGI скриптов, вы можете изменить файл конфигурации httpd.conf следующим образом:

Добавьте суффикс .py AddHandler, так что мы можем получить доступ к файлу питон скрипт .py конец:

Первая программа CGI

Мы используем Python для создания первой программы CGI под названием hello.py, файл находится в папке / Var / WWW / CGI-BIN директории, следующим образом:

После того, как вы сохраните изменения файла hello.py, изменять права доступа к файлам на 755:

Вышеприведенная программа отображается в браузере, чтобы получить доступ к результатам являются следующие:

Hello.py этот сценарий является простой скрипт Python, сценарий первого вывода строки «Content-Type: Текст / html» для отправки к типу браузера и сообщить браузеру для отображения содержимого как «текст / html».

Выход печати с пустой строки используется, чтобы сообщить конец сервера информации заголовка.

заголовок HTTP

hello.py содержимое файла в: часть заголовка HTTP является «Content-Type текст / html», он будет направлен к типу контента браузер сообщает файлы браузера.

Формат заголовка HTTP, выглядит следующим образом:

В следующей таблице приведены сведения в программах CGI заголовка HTTP часто используются:

руководитель описание
Content-Type: MIME-объект, соответствующий запросу информации. Например: Content-Type: Текст / html
Истекает: Дата дата и время отклика истекло
Расположение: URL Чтобы перенаправить получателя на запрос, не расположение URL для выполнения запроса или идентификации новых ресурсов
Последнего изменения: Дата Запрошенный ресурс Последнее изменение
Content-Length: N Запрос Content-Length
Set-Cookie: String Настройки Http Cookie

Переменные окружения CGI

Все программы CGI получили следующие переменные окружения, которые сыграли важную роль в программе CGI:

имя переменной описание
CONTENT_TYPE Это значение указывает на то, что переменная окружения к MIME типа передачи информации. В настоящее время переменные среды, как правило, CONTENT_TYPE: применение / х-WWW-форм-urlencoded, он сказал, что данные из HTML-формы.
CONTENT_LENGTH Если информация о режиме передачи сервера и программа CGI является POST, даже если переменная окружения ввода STDIN число байтов, которые можно прочитать достоверные данные от стандарта. Эта переменная окружения при чтении входных данных должны быть использованы.
HTTP_COOKIE содержание COOKIE в клиенте.
HTTP_USER_AGENT Предоставление информации включает в себя номер версии браузера клиента или других собственных данных.
PATH_INFO Значение этой переменной среды указывает имя программы CGI сразу после получения дополнительной информации о пути. Он часто появляется в качестве аргумента программы CGI.
QUERY_STRING Если информация о режиме передачи сервера и программы CGI информация GET, значение этой переменной окружения, даже если он будет принят. Эта информация следует имя программы CGI, как в середине с вопросительным знаком «?» Сепаратор.
REMOTE_ADDR Значение этой переменной окружения является IP-адрес клиента, отправляет запрос, например, выше 192.168.1.67. Это значение всегда присутствует. И это необходимо, чтобы обеспечить веб-клиент уникальный идентификатор веб-сервера может быть использован в программах CGI различать между различными веб-клиента.
REMOTE_HOST Значение этой переменной окружения содержит имя хоста запрашивающего клиента CGI. Если это не вы хотите проверить, что вам не нужно определить эту переменную окружения.
REQUEST_METHOD Она обеспечивает метод, называемый сценарий. Для сценария / протокола HTTP 1.0 только GET и POST осмысленным.
SCRIPT_FILENAME Полный путь к CGI-скриптов
SCRIPT_NAME Имя сценария CGI
SERVER_NAME Это имя хоста, псевдоним или IP-адрес вашего веб-сервера.
SERVER_SOFTWARE Значение этой переменной окружения содержит вызов CGI название программы и номер версии сервера HTTP. Например, указанное выше значение Apache / 2.2.14 (Unix)
Цукерберг рекомендует:  Как самоорганизоваться маркетологу на удаленной работе.

Вот простой CGI скрипт CGI переменные окружения выход:

Сохраните вышеуказанные пункты test.py и изменять права доступа к файлам на 755, результаты выполнения следующим образом:

GET и POST методы

Браузер клиента к серверу для доставки информации двумя способами, оба из которых метод GET является и методы POST.

Используйте метод GET передачи данных

GET метод для отправки закодированную информацию о пользователе на сервер, информационные данные, содержащиеся в URL запроса страницы на номер распределились следующим образом «?»:


GET запросы о некоторых из других комментариев:

  • GET запрос может быть кэширован
  • запрос GET остается в истории браузера
  • GET запросы могут быть закладкой
  • GET запросов не следует использовать при работе с конфиденциальными данными
  • GET запросы имеют ограничения длины
  • GET запросы должны быть использованы только для получения данных

Примеры простых URL: Получ

Ниже приведен простой URL, используя метод GET для отправки два параметра hello_get.py программы:

Файл код hello_get.py:

После того, как вы сохраните изменения файла hello_get.py, изменять права доступа к файлам на 755:

Браузер запрашивает вывод:

Примеры простой формы: Получ

Ниже приводится две передачи данных на сервер с помощью метода GET через HTML-формы, который был представлен один и тот же сценарий сервера файл hello_get.py, hello_get.html код выглядит следующим образом:

По умолчанию каталог CGI-BIN может хранить только файл сценария, мы будем находиться под тестовый каталог, изменить файл разрешения hello_get.html хранится в виде 755:

Gif презентация выглядит следующим образом:

Используйте метод POST для передачи данных

С помощью метода POST для передачи данных на сервер является более безопасным и надежным, так как некоторые конфиденциальной информации, такой как пароли пользователя нужно использовать POST для передачи данных.

Ниже также hello_get.py, он также может обрабатывать данные формы POST, представленные в браузере:

Ниже приводится форма для отправки данных на сервер hello_get.py сценария с помощью метода POST (метод = «пост»):

Gif презентация выглядит следующим образом:

CGI программа для передачи данных через флажок

флажок используется для передачи одного или нескольких опций данных, HTML код выглядит следующим образом:

Файл код checkbox.py:

Изменение checkbox.py разрешения:

Браузер Access Gif презентации графики:

Передача данных с помощью радио программы CGI

Радио только передавать данные на сервер, HTML код выглядит следующим образом:

radiobutton.py код сценария выглядит следующим образом:

Изменение radiobutton.py разрешения:

Браузер Access Gif презентации графики:

передача данных Textarea через программу CGI

Textarea передать несколько строк данных на сервер, HTML код выглядит следующим образом:

textarea.py код сценария выглядит следующим образом:

Изменить разрешения textarea.py:

Браузер Access Gif презентации графики:

Выпадающее данные проходят через программу CGI.

HTML код выпадающий следующим образом:

dropdown.py код сценария следующим образом:

Изменение dropdown.py разрешения:

Браузер Access Gif презентации графики:


Протокол Http в большой недостаток, неправильно судить личность пользователя, которые дают программистам большое неудобство, но появляется функциональность печенья, составленную этот недостаток.

Cookie, который обращается скрипт, а клиент через браузер клиента на жестком диске клиента, чтобы сохранить записи данных, извлечения данных, когда клиент посещает следующий сценарий, с тем, чтобы достигнуть функции определения идентичности, печенье, обычно используемый в проверке подлинности личности.

синтаксис печенья

Http печенье отправляется через заголовок HTTP, чтобы достигнуть, он должен был передавать файлы, синтаксис заголовка Set-Cookie выглядит следующим образом:

  • Имя = имя: установить значение куки (имя не может быть использована «,» и «,» номер), когда есть несколько значений имен «,» отделить, например: name1 = name1; имя2 = имя2 ; name3 = NAME3.
  • истекает = дата: дата окончания срока действия куки в формате: истекает = «Wdy, dd- пн-YYYY HH: MM: SS»
  • путь = путь: путь установить поддержку куки, если путь есть путь, куки для всех файлов и подкаталогов записи каталога в силу, например: путь = «/ CGI-BIN /», если путь файла, печенье Это относится к вступлению в силу этого файла, например: путь = «/ CGI-BIN / cookie.cgi».
  • домен = домен: доменное имя куки действительна, например: домен = «www.w3big.com»
  • обеспечить: Если этот флаг задан, что печенье может передаваться только через сервер HTTPS протокола SSL.
  • печенье получена путем установки переменных окружения HTTP_COOKIE достигнуты, программы CGI может получать информацию, извлекая переменную куки.

Настройки Cookie очень просто, печенье будет отправлено отдельно в заголовке HTTP. Следующий пример задает имя и истекает в куки:

Сохраните код выше cookie_set.py и изменять cookie_set.py разрешения:

Приведенные выше примеры используют заголовок Set-Cookie, чтобы установить информацию Cookie, опции устанавливают Cookie другие атрибуты, такие как истечения времени истекает, домена Домен, путь Путь. предоставляется следующая информация: Перед тем как «Content-Type текст / html».

Cookie страницы информационного поиска очень проста, в CGI переменные окружения HTTP_COOKIE, формат хранения выглядит следующим образом информация Cookie хранится:

Вот простая программа CGI для извлечения информации куки:

Сохраните код выше cookie_get.py и изменять cookie_get.py разрешения:

Больше настроек цвета Gif печенья заключаются в следующем:

Примеры загрузки файлов

Настройки HTML файл для загрузки нужно установить атрибут ENCTYPE для мультисекционного / форм-данных, код следующим образом :

Код save_file.py файл сценария выглядит следующим образом:

Сохраните код выше save_file.py и изменять save_file.py разрешения:

Больше настроек цвета Gif печенья заключаются в следующем:

Если вы используете Unix / Linux, вы должны заменить файл разделитель в окне необходимо использовать только открытые () заявление может быть:

диалоговое окно Загрузка файла

Мы создаем foo.txt файл в текущей директории для загрузки программы.

Чтобы загрузить файл, установив информацию заголовка HTTP, для реализации функции код выглядит следующим образом:

Python

Python — это один из наиболее популярных современных языков программирования. Он пригоден для решения разнообразных задач и предлагает те же возможности, что и другие языки программирования: динамичность, поддержку ООП и кросс-платформенность. Разработка Python началась еще в середине 1990-х годов, поэтому к настоящему времени удалось существенно развить лучшие стороны языка и привлечь множество программистов, использующих Python для реализации своих проектов.

Версии Python на хостинге Spaceweb

На данный момент на наших серверах виртуального хостинга установлено 3 версии Python. Это Python 2.7, 3.3, 3.4. Точные версии можно узнать командами:

Запуск скрипта python через CGI

CGI (от англ. Common Gateway Interface — «общий интерфейс шлюза») — стандарт интерфейса, используемого для связи внешей программы с веб-сервером. Программу, которая работает по такому интерфейсу совместно с веб-сервером, принято называть шлюзом, хотя многие предпочитаю названия «скрипт»(сценарий) или «CGI-программа».

Для запуска скриптов python через CGI необходимо выполнить следующие действия:

  1. Добавить в файл .htaccess директиву:

  1. Указать первой строкой в скрипте путь к используемому интерпретатору. Так называемый shebang.

для использования python 2.7.5 или другую версию

  1. Указать расширение для файла *.py и выставить на файл права доступа 755.

Запуск скрипта python через mod_wsgi

WSGI (англ. Web Server Gateway Interface) — стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, и самим веб-сервером, например, Apache.
Стандарт интерфейса (на английском): http://www.python.org/dev/peps/pep-0333/

По стандарту, WSGI-приложение должно удовлетворять следующим требованиям:

  • должно быть вызываемым (callable) объектом (обычно это функция или метод);
  • принимать два параметра:
    • словарь переменных окружения (environ);
    • обработчик запроса (start_response);
  • вызывать обработчик запроса с кодом HTTP-ответа и HTTP-заголовками;
  • возвращать итерируемый объект с телом ответа;

Пример простого wsgi-приложения:

Используемая версия python для mod_wsgi

На наших серверах mod_wsgi использует версию python 2.7.5

Из опыта Web-мастера: переползаем на Python

Осенью прошлого года был запущен сайт www.iso.ru, разработанный компанией ADT. «Движок» сайта, представляющий собой набор CGI скриптов, был написан на Perl. По прошествии полугода эксплуатации возникла необходимость расширить функциональность сайта. Поэтому встал вопрос о выборе языка для написания скриптов.

Perl хорошо подходит для обработки текстов и широко используется для web-программирования, однако программы, написанные на Perl, трудночитаемы и неудобны для сопровождение из-за специфического синтаксиса Perl’a. Если стоит задача быстро написать небольшой скрипт усилиями одного человека и у вас специфический склад мышления, то, возможно, Perl — это то, что вам нужно. Если же требуется разработать достаточно сложную систему и затем организовать ее поддержку коллективом специалистов, то для этих целей, на мой взгляд, более подходит Python.

Python сочетает в себе понятный синтаксис и мощь, имеет развитые средства обработки текста и создания web-приложений. Python доступен для различных операционных систем, таких как UNIX (Linux), MacOS, MS-Windows 3.1, Windows NT, OS/2 и даже MS-DOS. Скрипты, написаные на Python являются хорошо переносимыми между платформами. Если бы возникла задача перенести сайт www.iso.ru с платформы Linux на Windows NT, потребовались бы минимальные изменения кода (по существу, пришлось бы только исправить пути к файлам шаблонов).

Таким образом, решено было использовать Python для написания скриптов для сайта www.iso.ru. «Движок» сайта состоял из следующих логических частей (скриптов):

  • Главная страница — вывод главной страницы сайта, списка новостей и событий.
  • Новости — вывод текста новости, списка архивных новостей сайта, клуба, технологий.
  • События — вывод текста события.
  • Регистрация — осуществление процедуры регистрации посетителя: запись в базу данных информации о посетителе, контроль уникальности учетных записей.
  • Работа с посетителями — проверка входного имени и пароля, организация скачивания файлов с сайта, подписка на новости, доступ к страницам технической поддержки.
  • Формоотправитель — скрипт, занимающийся отправкой заполненых посетителем форм на e-mail поддержки сайта.
  • Журнал — работа с базой данных журнала статей по IT-технологиям.
  • Гостевая книга — запись и просмотр комментариев к статьям журнала.
  • Конференции
  • Административный интерфейс — редактирование таблиц базы данных сайта, загрузка новых статей, новостей, событий, выгрузка данных из базы в формат CSV, управление конференциями.

В первую очередь было решено расширить функциональность журнала -добавить систему оценки статей и сервис выбора самой интересной в данном номере. Таким образом, в список потребовалось добавить еще один скрипт. Все остальные скрипты также нужно было в большей или меньшей степени усовершенствовать.

Все скрипты написаны достаточно стандартным образом: создается экземпляр класса FieldStorage, который читает содержимое формы, затем, в зависимости от наличия и содержания определенных ключей организуется ветвление, обработка данных и вывод результата. В этой статье мне хотелось бы только поделиться опытом преодоления некоторых трудностей, возникших при разработке скриптов для www.iso.ru.

Формирование HTML из шаблонов

Как известно, вывод любой CGI программы состоит из двух частей: заголовка и данных, которые разделяются пустой строкой. Сначала программа должна сообщить клиенту, какой тип данных он будет получать. Это достигается печатью набора HTTP заголовков в стандартный вывод. Например, строка

сообщает браузеру, что он будет получать стандартный HTML.

Затем, после разделительной строки, идут произвольные данные (обычно, код HTML). Конечно, можно просто вывести HTML текст оператором print, вставленным в тело программы, но это подходит лишь для небольших фрагментов HTML кода. Когда же необходимо вывести несколько десятков строчек, исходный текст программы становиться очень большим и нечитаемым, к тому же иногда необходимо использовать одни и те же фрагменты кода с незначительными изменениями. В этом случае удобно использовать шаблоны.

Цукерберг рекомендует:  Amazon - Хостинг на amazon

Шаблон представляет собой текстовый файл, содержащий HTML код с переменными, которые впоследствии будут заменяться необходимыми значениями. Имена переменных желательно сделать такими, чтобы исключить их случайное повторение внутри HTML кода (например, не нужно использовать переменную с именем table, так как потом в результате пострадают все определения таблиц). Для переменных в своих шаблонах я использую следующее соглашение: имя переменной начинается и заканчивается символом $ (например, $var_name$). Это исключает возмоожность совпадения с тегами HTML и словами в тексте документа.

Вот пример шаблона гостевой книги, хранящийся в файле guestbook.tmpl:

Для удобства работы можно написать функцию, читающую шаблон и заменяющую все переменные в нем на нужные значения. Она получает в качестве аргументов имя шаблона и словарь, представляющий собой набор пар : . Возвращает функция сконструированный текст. Функция может выгладеть примерно так:

А вот скрипт, выводящий запись в гостевой книге:

Все динамические странички на сайте www.iso.ru формируются таким способом.

Работа с сервером баз данных MySQL


Практически любой сайт, содержащий элементы взаимодействия с пользователем использует какие-либо базы данных. Сайт www.iso.ru не является исключением. В базе данных хранятся новости, события, статьи журнала, информация по зарегистрированным пользователям и многое другое. Мы используем сервер баз данных MySQL.

На данный момент MySQL является наиболее популярной платформой для создания web-приложений, так как это простой и в тоже время довольно мощный и надежный SQL сервер. MySQL как и Python поддерживает широчайший спектр платформ, включая Linux и Windows NT. Для работы с MySQL в Python используется библиотека MySQLdb, существующая как для Linux, так и для Win32.

Работа с базой данных проходит достаточно стандартно. Сначала создается объект, устанавливающий соединение с БД (Connection Object):

Затем создается объект-курсор:

После этого можно выполнять любые SQL запросы к базе данных:

Далее получаем результат запроса:

Метод fetchall возвращает кортеж записей, состоящих из кортежей полей, которые можно перебрать в цикле. Приведенная ниже программа выбирает из базы гостевой книги все сообщения автора «Иванов», подставляет их в шаблон и передает браузеру.

Отправка форм

Часто возникает задача передачи данных от пользователя на сайт (пожелания по работе сайта, материалы, которые пользователю хотелось бы разместить на сайте и т.д). В простейшем случае — это текстовое сообщение, набираемое в форме и посылаемое затем на электронный адрес поддержки сайта. В этом случае форма может выглядеть следующим образом:

Для отправки сообщений по протоколу SMTP нужно использовать библиотеку smtplib. Определяя экземпляр класса SMTP, устанавливаем соединение с SMTP сервером:

Формируем тело сообщения из полученных данных в соответствии с RFC822:

Затем вызываем метод sendmail для отсылки сообщения:

Здесь admin@iso.ru — адрес отправителя, market@iso.ru — адрес получателя. Можно реализовать и более сложную функциональность с пересылкой вложенных файлов. Для начала в форму нужно добавить поле ввода file:

Для создания почтового сообщения с вложениями удобно пользоваться классом MimeWriter, определенным в модуле MimeWriter. Чтобы избежать загромождения тела программы, можно написать функцию, получающую на входе текст сообщения (text), содержание поля file формы (file), имя файла (name), тему письма (subj), адрес получателя (address) и отправляющую по этому адресу письмо с вложением. Отправителем в данном случае всегда является admin@iso.ru.

Функция представляет файл в кодировке base64 и конструирует многокомпонентный документ MIME, который отправляет по адресу address.

А вот пример использования этой функции:

Проверка корректности форм

Большинство CGI-скриптов работают с данными, полученными из форм. Для успешного использования этих данных необходимо проверить их корректность. В простейшем случае, это — просто проверка существования заполненного поля:

В более сложных случаях, таких как проверка корректности введенного e-mail адреса требуется использование модуля re для сопоставления полученных данных с регулярными выражениями. Например, регулярное выражение [-_w0-9]+@[-_w0-9]+.w+ определяет e-mail адрес следующим образом: [-_w0-9] обозначает любую букву, цифру или знак «-» и «_», + — одно или более повторений предыдущего выражения, @ — «собака», . — точка, w+ — не менее одной буквы. Таким образом все адреса вида name@domain1.domain2 попадают под это определение.

Административный интерфейс

Для облегчения сопровождения сайта был разработан административный интерфейс — набор скриптов для контроля за контентом. Он состоит из следующих частей:

  1. Главный административный скрипт; скрипт позволяет:
    • добавить новость, событие, статью в журнал, создать новую тему для журнала и новый журнал со статьей;
    • редактировать (и удалять) новости, события, статьи журнала, темы журнала, атрибуты пользователей, комментарии к статьям.
  2. Скрипт управления конференциями; скрипт обеспечивает просмотр и удаление сообщений, добавление новых конференций.
  3. Скрипт выгрузки данных; скрипт отвечает за экспорт данных из таблиц в формат CSV.

Все скрипты достаточно жестко привязаны к структуре сайта, поэтому нет смысла подробно разбирать их. Хочу затронуть только один момент: удобно сделать отдельную таблицу для размещения информации о полях таблиц, используемых скриптами сайта. Это позволит писать универсальные функции администрирования для разных таблиц. Например, функция, реализующая вывод списка записей на нашем сайте построена следующим образом: на входе она получает имя таблицы, по нему читается информация о таблице из служебной таблицы (названия полей, выводить ли поле в списке и т.д.) и на основании полученной информации выводится список записей. Так как список, состоящий из всех полей, очень громоздкий (статья в журнале может занимать несколько страниц), в списке выводятся только те поля, для которых в служебной таблице стоит флаг вывода в списке. Благодаря этому добавление новых таблиц в базу требует лишь записи информации о них в служебную таблицу.

Примеры создания скриптов на python (*.py)

Внимание: примеры для mod_python даны для ознакомления, рекомендуется использовать запуск под CGI или FastCGI.

1. Пример Python скрипта для обработки формы, рассчитанный на mod_python:

Для того чтобы Ваши скрипты, разработанные на python работали под Apache (mod_python), Вам необходимо в файле .htaccess корня сайта, добавить следующее:

После чего скрипт можно помещать в любой каталог Вашего сайта.

2. Пример Python скрипта для обработки формы, рассчитанный на запуск под CGI:

Данный скрипт необходимо поместить в каталог cgi-bin домашнего каталога и выставить права на запуск.

3. Пример Python скрипта для обработки формы, рассчитанный на запуск под mod_python.cgihandler :

4. Пример Python скрипта для обработки формы, рассчитанный на запуск под FastCGI:

В файл .htaccess корня сайта, необходимо добавить следующее:

Так же необходимо положить файл fcgi.py в один каталог со скриптом обработки формы или в любой другой каталог прописав путь к нему в переменной окружения PYTHONPATH .


У сотрудников хостинга КОМТЕТ большой опыт по разработке и интегрции Python-проектов, вы всегда можете обратиться к нам за помощью и консультацией.

Другие документы на эту тему

КОМТЕТ — профессиональный Python-хостинг, наши системные администраторы и программисты отлично разбираются в настройке python-приложений. Сотрудники хостинга умеют работать и с python-фреймворками Django, TurboGears, Pylons, Zope. Часто задаваемые вопросы по Python, а также различные советы, публикуются в разделе «Python» хостинга КОМТЕТ. Мы следим за новостями в мире Python — и публикуем подробные описания новых релизов Python. Сайт КОМТЕТ открыт для публикаций и дружественных авторов!

Средства для развёртывания веб-приложений на Python и Django.

Тарифные планы «Виртуальный хостинг» — от размещения статических HTML-страниц, до поддержки PHP, Python, CGI скриптов (Shell, Perl), SSI, Ruby. В рамках тарифных планов предоставляется доступ к серверам баз данных MySQL или PostgreSQL.

Как вступить в партнёрскую программу и получить выгоду от сотрудничества с КОМТЕТ.

От Python скрипта до WSGI приложения

Появилась задача написать веб интерфейс управления устройством. Управлять устройством будет Raspberry Pi. Логика управления — python, соответственно и интерфейс хотелось бы python. Хочу поделится своим опытом.

  • 1. lighttpd mod_cgi и простой скрипт
  • 2. web.py на порту 8080
  • 3. WCGI интерфейс
  • 4. Простой сервер WSGI
  • 5. WSGI с использованием wsgiref
  • 6. WSGI c помощью flup
  • 7. web.py приложение с использованием flup
  • 8. Немного особенностей

1. Для решения задачи «в лоб» был поднят lighttpd c mod_cgi:

теперь localhost/index.py отвечал бодрым «Hello World!»

Когда lighttpd встречает файл с расширением .py передает его на выполнение python-у и его результатом отвечает на запрос. Грубо говоря перенаправляет stdout.
После некоторых попыток написания интерфейса «с нуля», был рожден HtmlGenerator, который позволил не перегружать код html-тегами, весьма упростил, но все таки не решил проблемы в комплексе.

2. Решено было поэкспериментировать с веб фреймворками.
Под руку попался wep.py, простенький и маловесный.
code.py:

Минимальный код и на порту 8080 висит наше веб приложение
Казалось бы пробросить алиас на порт 8080, организовать авто запуск скрипта и все готово.
Да но нет, эксперименты на слабеньком компьютере показали что присутствие нашего скрипта заставляет машинку изрядно «дуться». Кроме того есть lighttpd с mod_cgi.

Как же связать простой скрипт и веб приложение.

3. Согласно описанию WSGI, для его реализации необходим интерфейс такого вида

Ничего военного, но и что-то не работает, чего-то не хватает.
Момент который был неясным после прочтения вики и других статей, что же все таки запустит наш интерфейс.

4. Для запуска WSGI приложения нужен сервер. Пример скрипта который может выступать в роли простого сервера WSGI:
wsgi.py:

Теперь добавив к нашему интерфейсу его запуск получим скрипт который ответит уже на нашем lighttpd или apache, по адресу localhost/app.py
/var/www/app.py:

5. Для python 2.7 доступен модуль wsgiref который может реализовать WSGI сервер

6. Реализация WSGI c помощью flup:
установим flup

7. Простое web.py приложение с использованием flup:
/var/www/app.py:

приложение станет доступным по адресу localhost/app.py

8. По умолчанию web.py использует flup, но можно обойтись и без него.
Для запуска web.py на wsgiref необходимо:

B ссылках на скрипты web.py в конце не забывать ставить ‘/’ (app.py/), иначе ответом будет «not found». По-хорошему необходимо создать rewrite правило:

Для отладки в скриптов полезно добавить:

тогда будут видны ошибки.

Остается опробовать:
modwsgi
paste
pylons

Лекция 8. CGI-программирование

CGI (Common Gateway Interface, общий интерфейс шлюза) — протокол для запуска внешних по отношению к web-серверу приложений (CGI-скриптов), регулирует коммуникацию между HTTP-сервером и CGI-скриптами.

При поступлении запроса на URL, который Web-сервер настроен считать CGI-скриптом, сервер вызывает скрипт, передавая ему информацию через стандартный ввод, переменные окружения и (для ISINDEX) — через аргументы командной строки.

Примечание: кроме того, для передачи ISINDEX могут использоваться аргументы командной строки. В Python они доступны в списке sys.argv .

Два основных метода передачи данных из заполненной в браузере формы Web-серверу (и CGI-скрипту) — method=»GET» и method=»POST» . В зависимости от метода данные передаются по-разному. В первом случае они кодируются и помещаются прямо в URL, типа: http://host/cgi-bin/a.cgi?a=1&b=3 . Скрипт получает их в переменной окружения QUERY_STRING . Во втором случае они передаются на стандартный ввод.

Следющий простейший скрипт выводит значения из словаря os.environ :

С помощью него можно увидеть установленные Web-сервером переменные окружения.

Основные переменные окружения следующие:

QUERY_STRING Строка запроса REMOTE_ADDR IP-адрес клиента REMOTE_USER Имя клиента (если он был авторизован) SCRIPT_NAME Имя скрипта SCRIPT_FILENAME Имя файла со скриптом SERVER_NAME Имя сервера HTTP_USER_AGENT Название браузера клиента REQUEST_URI Строка запроса (URI) HTTP_USER_AGENT Имя сервера HTTP_ACCEPT_LANGUAGE Желательный язык документа

В Python имеется поддержка CGI в виде модуля cgi . пример:

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих