Лучшее руководство по программирование CGI Python в 2024 году. В этом руководстве вы можете изучить Что такое CGI,просмотр веб-страниц,CGI Chart,Конфигурация сервера Web и поддержка,Первая программа CGI,заголовок HTTP,Переменные окружения CGI,GET и POST методы,CGI используется Cookie,настройки Cookie,Получение Cookie Информация,диалоговое окно Загрузка файла,
CGI в настоящее время поддерживается NCSA, NCSA CGI определяется следующим образом:
CGI (Common Gateway Interface), Common Gateway Interface, который является программа, работающая на сервере, например: HTTP-сервер, клиентский интерфейс обеспечивает такой же HTML-страницу.
Чтобы лучше понять, как работает CGI, мы можем нажать на ссылку на веб-странице или URL процесса:
Программы CGI могут быть сценарий Python, Perl скрипт, скрипт SHELL, C или C ++ программ.
Перед тем, как проводить программирование 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
Мы используем Python для создания первой программы CGI под названием hello.py, файл находится в папке / Var / WWW / CGI-BIN директории, следующим образом:
#!/usr/bin/python # -*- coding: UTF-8 -*- 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".
Выход печати с пустой строки используется, чтобы сообщить конец сервера информации заголовка.
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:
имя переменной | описание |
---|---|
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/python # -*- coding: UTF-8 -*- # filename:test.py 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 метод для отправки закодированную информацию о пользователе на сервер, информационные данные, содержащиеся в URL запроса страницы на номер распределились следующим образом "?":
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2GET запросы о некоторых из других комментариев:
Ниже приведен простой URL, используя метод GET для отправки два параметра hello_get.py программы:
/cgi-bin/test.py?name=本教程&url=http://www.w3write.com
Файл код hello_get.py:
#!/usr/bin/python # -*- coding: UTF-8 -*- # filename:test.py # 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 код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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 хранится в виде 755:
chmod 755 hello_get
Gif презентация выглядит следующим образом:
С помощью метода POST для передачи данных на сервер является более безопасным и надежным, так как некоторые конфиденциальной информации, такой как пароли пользователя нужно использовать POST для передачи данных.
Ниже также hello_get.py, он также может обрабатывать данные формы POST, представленные в браузере:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 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>本教程(w3write.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>
Gif презентация выглядит следующим образом:
флажок используется для передачи одного или нескольких опций данных, HTML код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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/python # -*- coding: UTF-8 -*- # 引入 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 презентации графики:
Радио только передавать данные на сервер, HTML код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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/python # -*- coding: UTF-8 -*- # 引入 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 передать несколько строк данных на сервер, HTML код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/textarea.py" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 在这里输入内容ru. </textarea> <input type="submit" value="提交" /> </form> </body> </html>
textarea.py код сценария выглядит следующим образом:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 引入 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 презентации графики:
HTML код выпадающий следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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/python # -*- coding: UTF-8 -*- # 引入 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 презентации графики:
Протокол Http в большой недостаток, неправильно судить личность пользователя, которые дают программистам большое неудобство, но появляется функциональность печенья, составленную этот недостаток.
Cookie, который обращается скрипт, а клиент через браузер клиента на жестком диске клиента, чтобы сохранить записи данных, извлечения данных, когда клиент посещает следующий сценарий, с тем, чтобы достигнуть функции определения идентичности, печенье, обычно используемый в проверке подлинности личности.
Http печенье отправляется через заголовок HTTP, чтобы достигнуть, он должен был передавать файлы, синтаксис заголовка Set-Cookie выглядит следующим образом:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
Настройки Cookie очень просто, печенье будет отправлено отдельно в заголовке HTTP. Следующий пример задает имя и истекает в куки:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 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>本教程(w3write.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 страницы информационного поиска очень проста, в CGI переменные окружения HTTP_COOKIE, формат хранения выглядит следующим образом информация Cookie хранится:
key1=value1;key2=value2;key3=value3ruru
Вот простая программа CGI для извлечения информации куки:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 导入模块 import os import Cookie print "Content-type: text/html" print print """ <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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>本教程(w3write.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/python # -*- coding: UTF-8 -*- 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>本教程(w3write.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/python # -*- coding: UTF-8 -*- # HTTP 头部 print "Content-Disposition: attachment; filename=\"foo.txt\""; print # 打开文件 fo = open("foo.txt", "rb") str = fo.read(); print str # 关闭文件 fo.close()