Latest web development tutorials

программирование 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

cgiarch


Конфигурация сервера 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=value2
GET запросы о некоторых из других комментариев:
  • 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()