программирование python3 CGI
Что такое 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:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
Все сервера HTTP для выполнения программы CGI сохраняются в предварительно сконфигурированной директории. Этот каталог называется каталог CGI, а также по соглашению, он называется / вар / WWW / CGI-BIN каталога.
CGI расширение файла .cgi, питон может также использовать .py расширение.
По умолчанию, конфигурация сервера Linux работает каталог CGI-BIN является / Var / WWW.
Если вы хотите указать другой каталог для запуска CGI скриптов, вы можете изменить файл конфигурации httpd.conf следующим образом:
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny Allow from all </Directory>
Добавьте суффикс .py AddHandler, так что мы можем получить доступ к файлу питон скрипт .py конец:
AddHandler cgi-script .cgi .pl .py
Первая программа CGI
Мы используем Python для создания первой программы CGI под названием hello.py, файл находится в папке / Var / WWW / CGI-BIN директории, следующим образом:
#!/usr/bin/python3 print ("Content-type:text/html") print () # 空行,告诉服务器结束头部 print ('<html>') print ('<head>') print ('<meta charset="utf-8">') print ('<title>Hello Word - 我的第一个 CGI 程序!</title>') print ('</head>') print ('<body>') print ('<h2>Hello Word! 我是来自本教程的第一CGI程序</h2>') print ('</body>') print ('</html>')
После того, как вы сохраните изменения файла hello.py, изменять права доступа к файлам на 755:
chmod 755 hello.py
Вышеприведенная программа отображается в браузере, чтобы получить доступ к результатам являются следующие:
Hello.py этот сценарий является простой скрипт Python, сценарий первого вывода строки "Content-Type: Текст / html" для отправки к типу браузера и сообщить браузеру для отображения содержимого как "текст / html".
Выход печати с пустой строки используется, чтобы сообщить конец сервера информации заголовка.
заголовок HTTP
hello.py содержимое файла в: часть заголовка HTTP является "Content-Type текст / html", он будет направлен к типу контента браузер сообщает файлы браузера.
Формат заголовка HTTP, выглядит следующим образом:
HTTP 字段名: 字段内容
Например:
Content-type: text/html
В следующей таблице приведены сведения в программах 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 переменные окружения выход:
#!/usr/bin/python3 import os print ("Content-type: text/html") print () print ("<meta charset=\"utf-8\">") print ("<b>环境变量</b><br>") print ("<ul>") for key in os.environ.keys(): print ("<li><span style='color:green'>%30s </span> : %s </li>" % (key,os.environ[key])) print ("</ul>")
Сохраните вышеуказанные пункты test.py и изменять права доступа к файлам на 755, результаты выполнения следующим образом:
GET и POST методы
Браузер клиента к серверу для доставки информации двумя способами, оба из которых метод GET является и методы POST.
Используйте метод GET передачи данных
GET метод для отправки закодированную информацию о пользователе на сервер, информационные данные, содержащиеся в URL запроса страницы на номер распределились следующим образом "?":
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2GET запросы о некоторых из других комментариев:
- GET запрос может быть кэширован
- запрос GET остается в истории браузера
- GET запросы могут быть закладкой
- GET запросов не следует использовать при работе с конфиденциальными данными
- GET запросы имеют ограничения длины
- GET запросы должны быть использованы только для получения данных
Примеры простых URL: Получ
Ниже приведен простой URL, используя метод GET для отправки два параметра hello_get.py программы:
/cgi-bin/test.py?name=本教程&url=http://www.w3big.com
Файл код hello_get.py:
#!/usr/bin/python3 # CGI处理模块 import cgi, cgitb # 创建 FieldStorage 的实例化 form = cgi.FieldStorage() # 获取数据 site_name = form.getvalue('name') site_url = form.getvalue('url') print ("Content-type:text/html") print () print ("<html>") print ("<head>") print ("<meta charset=\"utf-8\">") print ("<title>本教程 CGI 测试实例</title>") print ("</head>") print ("<body>") print ("<h2>%s官网:%s</h2>" % (site_name, site_url)) print ("</body>") print ("</html>")
После того, как вы сохраните изменения файла hello_get.py, изменять права доступа к файлам на 755:
chmod 755 hello_get.py
Браузер запрашивает вывод:
Примеры простой формы: Получ
Ниже приводится две передачи данных на сервер с помощью метода GET через HTML-формы, который был представлен один и тот же сценарий сервера файл hello_get.py, hello_get.html код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/hello_get.py" method="get"> 站点名称: <input type="text" name="name"> <br /> 站点 URL: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html>
По умолчанию каталог CGI-BIN может хранить только файл сценария, мы будем находиться под тестовый каталог, изменить файл разрешения hello_get.html хранится в виде 755:
chmod 755 hello_get.html
Gif презентация выглядит следующим образом:
Используйте метод POST для передачи данных
С помощью метода POST для передачи данных на сервер является более безопасным и надежным, так как некоторые конфиденциальной информации, такой как пароли пользователя нужно использовать POST для передачи данных.
Ниже также hello_get.py, он также может обрабатывать данные формы POST, представленные в браузере:
#!/usr/bin/python3 # CGI处理模块 import cgi, cgitb # 创建 FieldStorage 的实例化 form = cgi.FieldStorage() # 获取数据 site_name = form.getvalue('name') site_url = form.getvalue('url') print ("Content-type:text/html") print () print ("<html>") print ("<head>") print ("<meta charset=\"utf-8\">") print ("<title>本教程 CGI 测试实例</title>") print ("</head>") print ("<body>") print ("<h2>%s官网:%s</h2>" % (site_name, site_url)) print ("</body>") print ("</html>")
Ниже приводится форма для отправки данных на сервер hello_get.py сценария с помощью метода POST (метод = "пост"):
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/hello_get.py" method="post"> 站点名称: <input type="text" name="name"> <br /> 站点 URL: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html> </form>
Gif презентация выглядит следующим образом:
CGI программа для передачи данных через флажок
флажок используется для передачи одного или нескольких опций данных, HTML код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/checkbox.py" method="POST" target="_blank"> <input type="checkbox" name="w3big" value="on" /> 本教程 <input type="checkbox" name="google" value="on" /> Google <input type="submit" value="选择站点" /> </form> </body> </html>
Файл код checkbox.py:
#!/usr/bin/python3 # 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据 if form.getvalue('google'): google_flag = "是" else: google_flag = "否" if form.getvalue('w3big'): w3big_flag = "是" else: w3big_flag = "否" print ("Content-type:text/html") print () print ("<html>") print ("<head>") print ("<meta charset=\"utf-8\">") print ("<title>本教程 CGI 测试实例</title>") print ("</head>") print ("<body>") print ("<h2> 本教程是否选择了 : %s</h2>" % w3big_flag) print ("<h2> Google 是否选择了 : %s</h2>" % google_flag) print ("</body>") print ("</html>")
Изменение checkbox.py разрешения:
chmod 755 checkbox.py
Браузер Access Gif презентации графики:
Передача данных с помощью радио программы CGI
Радио только передавать данные на сервер, HTML код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/radiobutton.py" method="post" target="_blank"> <input type="radio" name="site" value="w3big" /> 本教程 <input type="radio" name="site" value="google" /> Google <input type="submit" value="提交" /> </form> </body> </html>
radiobutton.py код сценария выглядит следующим образом:
#!/usr/bin/python3 # 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据 if form.getvalue('site'): site = form.getvalue('site') else: site = "提交数据为空" print ("Content-type:text/html") print () print ("<html>") print ("<head>") print ("<meta charset=\"utf-8\">") print ("<title>本教程 CGI 测试实例</title>") print ("</head>") print ("<body>") print ("<h2> 选中的网站是 %s</h2>" % site) print ("</body>") print ("</html>")
Изменение radiobutton.py разрешения:
chmod 755 radiobutton.py
Браузер Access Gif презентации графики:
передача данных Textarea через программу CGI
Textarea передать несколько строк данных на сервер, HTML код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/textarea.py" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 在这里输入内容... </textarea> <input type="submit" value="提交" /> </form> </body> </html>
textarea.py код сценария выглядит следующим образом:
#!/usr/bin/python3 # 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据 if form.getvalue('textcontent'): text_content = form.getvalue('textcontent') else: text_content = "没有内容" print ("Content-type:text/html") print () print ("<html>") print ("<head>") print ("<meta charset=\"utf-8\">") print ("<title>本教程 CGI 测试实例</title>") print ("</head>") print ("<body>") print ("<h2> 输入的内容是:%s</h2>" % text_content) print ("</body>") print ("</html>")
Изменить разрешения textarea.py:
chmod 755 textarea.py
Браузер Access Gif презентации графики:
Выпадающее данные проходят через программу CGI.
HTML код выпадающий следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/dropdown.py" method="post" target="_blank"> <select name="dropdown"> <option value="w3big" selected>本教程</option> <option value="google">Google</option> </select> <input type="submit" value="提交"/> </form> </body> </html>
dropdown.py код сценария следующим образом:
#!/usr/bin/python3 # 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据 if form.getvalue('dropdown'): dropdown_value = form.getvalue('dropdown') else: dropdown_value = "没有内容" print ("Content-type:text/html") print () print ("<html>") print ("<head>") print ("<meta charset=\"utf-8\">") print ("<title>本教程 CGI 测试实例</title>") print ("</head>") print ("<body>") print ("<h2> 选中的选项是:%s</h2>" % dropdown_value) print ("</body>") print ("</html>")
Изменение dropdown.py разрешения:
chmod 755 dropdown.py
Браузер Access Gif презентации графики:
CGI используется Cookie
Протокол Http в большой недостаток, неправильно судить личность пользователя, которые дают программистам большое неудобство, но появляется функциональность печенья, составленную этот недостаток.
Cookie, который обращается скрипт, а клиент через браузер клиента на жестком диске клиента, чтобы сохранить записи данных, извлечения данных, когда клиент посещает следующий сценарий, с тем, чтобы достигнуть функции определения идентичности, печенье, обычно используемый в проверке подлинности личности.
синтаксис печенья
Http печенье отправляется через заголовок HTTP, чтобы достигнуть, он должен был передавать файлы, синтаксис заголовка Set-Cookie выглядит следующим образом:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
- Имя = имя: установить значение куки (имя не может быть использована "," и "," номер), когда есть несколько значений имен "," отделить, например: 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
Настройки Cookie очень просто, печенье будет отправлено отдельно в заголовке HTTP. Следующий пример задает имя и истекает в куки:
#!/usr/bin/python3 # print ('Content-Type: text/html') print ('Set-Cookie: name="本教程";expires=Wed, 28 Aug 2016 18:30:00 GMT') print () print (""" <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <h1>Cookie set OK!</h1> </body> </html> """)
Сохраните код выше cookie_set.py и изменять cookie_set.py разрешения:
chmod 755 cookie_set.py
Приведенные выше примеры используют заголовок Set-Cookie, чтобы установить информацию Cookie, опции устанавливают Cookie другие атрибуты, такие как истечения времени истекает, домена Домен, путь Путь. предоставляется следующая информация: Перед тем как "Content-Type текст / html".
Получение Cookie Информация
Cookie страницы информационного поиска очень проста, в CGI переменные окружения HTTP_COOKIE, формат хранения выглядит следующим образом информация Cookie хранится:
key1=value1;key2=value2;key3=value3....
Вот простая программа CGI для извлечения информации куки:
#!/usr/bin/python3 # 导入模块 import os import Cookie print ("Content-type: text/html") print () print (""" <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <h1>读取cookie信息</h1> """) if 'HTTP_COOKIE' in os.environ: cookie_string=os.environ.get('HTTP_COOKIE') c=Cookie.SimpleCookie() c.load(cookie_string) try: data=c['name'].value print ("cookie data: "+data+"<br>") except KeyError: print ("cookie 没有设置或者已过去<br>") print (""" </body> </html> """)
Сохраните код выше cookie_get.py и изменять cookie_get.py разрешения:
chmod 755 cookie_get.py
Больше настроек цвета Gif печенья заключаются в следующем:
Примеры загрузки файлов
Настройки HTML файл для загрузки нужно установить атрибут ENCTYPE для мультисекционного / форм-данных, код следующим образом :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form enctype="multipart/form-data" action="/cgi-bin/save_file.py" method="post"> <p>选中文件: <input type="file" name="filename" /></p> <p><input type="submit" value="上传" /></p> </form> </body> </html>
Код save_file.py файл сценария выглядит следующим образом:
#!/usr/bin/python3 import cgi, os import cgitb; cgitb.enable() form = cgi.FieldStorage() # 获取文件名 fileitem = form['filename'] # 检测文件是否上传 if fileitem.filename: # 设置文件路径 fn = os.path.basename(fileitem.filename) open('/tmp/' + fn, 'wb').write(fileitem.file.read()) message = '文件 "' + fn + '" 上传成功' else: message = '文件没有上传' print ("""\ Content-Type: text/html\n <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <p>%s</p> </body> </html> """ % (message,))
Сохраните код выше save_file.py и изменять save_file.py разрешения:
chmod 755 save_file.py
Больше настроек цвета Gif печенья заключаются в следующем:
Если вы используете Unix / Linux, вы должны заменить файл разделитель в окне необходимо использовать только открытые () заявление может быть:
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))
диалоговое окно Загрузка файла
Мы создаем foo.txt файл в текущей директории для загрузки программы.
Чтобы загрузить файл, установив информацию заголовка HTTP, для реализации функции код выглядит следующим образом:
#!/usr/bin/python3 # HTTP 头部 print ("Content-Disposition: attachment; filename=\"foo.txt\"") print () # 打开文件 fo = open("foo.txt", "rb") str = fo.read(); print (str) # 关闭文件 fo.close()