Чтение заголовка клиента из Python CGI script?
Я пишу очень простой веб-сервис, написанный на Python и исполняемый как CGI на сервере Apache.
В соответствии с документами Python (где-то... я забыл, где), я могу использовать sys.stdin для чтения данных POSTed случайным клиентом, и это работает нормально. Однако я хотел бы также прочитать информацию заголовка HTTP - входящий IP-адрес, пользовательский агент и т.д. Я бы также хотел, чтобы это было очень просто, используя только библиотеки Python (так что не mod-python). Как это сделать?
Ответы
Ответ 1
Если вы работаете как CGI, вы не можете напрямую прочитать HTTP-заголовок, но веб-сервер помещает большую часть этой информации в переменные окружения для вас. Вы можете просто выбрать его из os.environ []
Список переменных среды, которые могут быть там, довольно длинные. Вы можете найти его, выполнив поиск в Интернете для "общего интерфейса шлюза". Например, в http://www.ietf.org/rfc/rfc3875.txt они называются мета-переменными.
Ответ 2
Они передаются CGI script через среду:
import os
user_agent = os.environ["HTTP_USER_AGENT"]
ip = os.environ["REMOTE_ADDR"]
Ответ 3
Как эта страница объясняет, что большинство заголовков HTTP-запросов доступны для ваших CGI script через переменные среды. Выполните cgi.test() вместо вашего script, чтобы увидеть среду (включая заголовки HTTP-запросов), отображаемую в вашем браузере посещения.
Ответ 4
Вот как я собираю в Python 3 из CGI (A) URL, (B) GET параметров и (C) POST данных:
================================================== =====
импортировать sys, os, io
CAPTURE URL
myDomainSelf = os.environ.get('SERVER_NAME')
myPathSelf = os.environ.get('PATH_INFO')
myURLSelf = myDomainSelf + myPathSelf
CAPTURE GET DATA
myQuerySelf = os.environ.get('QUERY_STRING')
ЗАПИСЬ ПОЧТОВЫХ ДАННЫХ
myTotalBytesStr = (os.environ.get( 'HTTP_CONTENT_LENGTH'))
if (myTotalBytesStr == Нет):
myJSONStr = '{"error": {"value": true, "message": "No (post) data received"}}'
еще:
myTotalBytes=int(os.environ.get('HTTP_CONTENT_LENGTH'))
myPostDataRaw = io.open(sys.stdin.fileno(),"rb").read(myTotalBytes)
myPostData = myPostDataRaw.decode("utf-8")
Написать RAW в файл
mySpy = "myURLSelf: [" + str (myURLSelf) + "]\n"
mySpy = mySpy + "myQuerySelf: [" + str (myQuerySelf) + "]\n"
mySpy = mySpy + "myPostData: [" + str (myPostData) + "]\n"
Вы должны определить свой собственный myPath здесь
myFilename = "spy.txt"
myFilePath = myPath + "\" + myFilename
myFile = open (myFilePath, "w")
myFile.write(mySpy)
myFile.close()
================================================== =====
Вот некоторые другие полезные переменные среды CGI:
AUTH_TYPE
CONTENT_LENGTH
ТИП СОДЕРЖИМОГО
GATEWAY_INTERFACE
PATH_INFO
PATH_TRANSLATED
СТРОКА ЗАПРОСА
REMOTE_ADDR
УДАЛЕННЫЙ УЗЕЛ
REMOTE_IDENT
REMOTE_USER
REQUEST_METHOD
SCRIPT_NAME
НАЗВАНИЕ СЕРВЕРА
ПОРТ СЕРВЕРА
SERVER_PROTOCOL
SERVER_SOFTWARE
=================================
Я использую эти методы на Windows Server с MIIS и Python 3 в режиме CGI.