Чтение заголовка клиента из скрипта Python CGI? - PullRequest
17 голосов
/ 20 апреля 2010

Я пишу очень простой веб-сервис, написанный на Python и работающий как CGI на сервере Apache.

Согласно документации Python (где-то ... я забыл, где), я могу использовать sys.stdin для чтения данных, отправленных случайным клиентом, и это работает нормально. Тем не менее, я хотел бы иметь возможность читать информацию заголовка HTTP - входящий IP, пользовательский агент и так далее. Я также хотел бы пока сделать это очень простым, используя только библиотеки Python (поэтому не mod-python). Как мне это сделать?

Ответы [ 4 ]

16 голосов
/ 20 апреля 2010

Если вы работаете как CGI, вы не можете читать HTTP-заголовок напрямую, но веб-сервер помещает большую часть этой информации в переменные среды для вас. Вы можете просто выбрать его из os.environ []

Список переменных среды, которые там могут быть, довольно длинный. Вы можете найти его, выполнив поиск в Интернете по запросу «общий интерфейс шлюза». Например, в http://www.ietf.org/rfc/rfc3875.txt они называются «мета-переменными».

9 голосов
/ 20 апреля 2010

Они передаются сценарию CGI через среду:

import os
user_agent = os.environ["HTTP_USER_AGENT"]
ip = os.environ["REMOTE_ADDR"]
4 голосов
/ 20 апреля 2010

Как объясняет на этой странице , большинство заголовков HTTP-запросов становятся доступными для вашего CGI-скрипта через переменные среды. Запустите cgi.test () вместо вашего скрипта, чтобы увидеть среду (включая заголовки HTTP-запроса), отображаемую в вашем браузере.

0 голосов
/ 23 января 2019

Вот как я собираю в Python 3 из CGI (A) URL, (B) GET параметров и (C) POST данных:

=============================================== ========

import 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')) * * 1 021

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

CONTENT_TYPE

GATEWAY_INTERFACE

PATH_INFO

PATH_TRANSLATED

QUERY_STRING

REMOTE_ADDR

REMOTE_HOST

REMOTE_IDENT

REMOTE_USER

REQUEST_METHOD

SCRIPT_NAME

SERVER_NAME

SERVER_PORT

SERVER_PROTOCOL

SERVER_SOFTWARE

=================================

Я использую эти методы на Windows Server с MIIS и Python 3 в режиме CGI.

...