Чтение заголовка клиента из 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.