簡體   English   中英

從Python CGI腳本中讀取客戶端的頭文件?

[英]Reading a client's header from Python CGI script?

我正在編寫一個非常簡單的Web服務,用Python編寫並在Apache服務器上作為CGI運行。

根據Python文檔(某處......我忘了哪里),我可以使用sys.stdin來讀取隨機客戶端發布的數據,這一切都運行正常。 但是,我希望能夠讀取HTTP頭信息 - 傳入IP,用戶代理等。 我現在也想通過僅使用Python庫(因此沒有mod-python)來保持它非常簡單。 我該怎么做呢?

如果您作為CGI運行,則無法直接讀取HTTP標頭,但Web服務器會將大部分信息放入環境變量中。 你可以從os.environ []中選擇它

可能存在的環境變量列表很長。 您可以通過Web搜索“公共網關接口”找到它。 例如,在http://www.ietf.org/rfc/rfc3875.txt中,它們被稱為“元變量”。

這些是通過環境提供給CGI腳本的:

import os
user_agent = os.environ["HTTP_USER_AGENT"]
ip = os.environ["REMOTE_ADDR"]

本頁所述 ,大多數HTTP請求標頭都可通過環境變量提供給CGI腳本。 運行cgi.test()而不是腳本,以查看顯示回訪問瀏覽器的環境(包括HTTP請求標頭)。

這是我在Python 3中從CGI(A)URL,(B)GET參數和(C)POST數據中捕獲的方式:

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

import sys,os,io

捕獲URL

myDomainSelf = os.environ.get('SERVER_NAME')

myPathSelf = os.environ.get('PATH_INFO')

myURLSelf = myDomainSelf + myPathSelf

捕獲數據

myQuerySelf = os.environ.get('QUERY_STRING')

捕獲發布數據

myTotalBytesStr =(os.environ.get( 'HTTP_CONTENT_LENGTH'))

if(myTotalBytesStr == None):

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上使用此方法,在CGI模式下使用MIIS和Python 3。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM