Reading a client's header from Python CGI script?

前端 未结 4 2140
我在风中等你
我在风中等你 2021-02-12 20:21

I\'m writing a very simple web service, written in Python and run as CGI on an Apache server.

According to Python docs (somewhere... I forgot where), I can use sys.stdin

相关标签:
4条回答
  • 2021-02-12 20:24

    These are given to the CGI script through the environment:

    import os
    user_agent = os.environ["HTTP_USER_AGENT"]
    ip = os.environ["REMOTE_ADDR"]
    
    0 讨论(0)
  • 2021-02-12 20:28

    If you are running as a CGI, you can't read the HTTP header directly, but the web server put much of that information into environment variables for you. You can just pick it out of os.environ[]

    The list of environment variables that might be there is pretty long. You can find it by doing a web search for "common gateway interface". For example, in http://www.ietf.org/rfc/rfc3875.txt they are called "meta-variables".

    0 讨论(0)
  • 2021-02-12 20:32

    As this page explains, most HTTP request headers are made available to your CGI script via environment variables. Run cgi.test() instead of your script to see the environment (including HTTP request headers) shown back to your visiting browser.

    0 讨论(0)
  • 2021-02-12 20:34

    This is how I capture in Python 3 from CGI (A) URL, (B) GET parameters and (C) POST data:

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

    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')

    CAPTURE POST DATA

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

    if (myTotalBytesStr == None):

    myJSONStr = '{"error": {"value": true, "message": "No (post) data received"}}'
    

    else:

    myTotalBytes=int(os.environ.get('HTTP_CONTENT_LENGTH'))
    
    myPostDataRaw = io.open(sys.stdin.fileno(),"rb").read(myTotalBytes)
    
    myPostData = myPostDataRaw.decode("utf-8")
    

    Write RAW to FILE

    mySpy = "myURLSelf: [" + str(myURLSelf) + "]\n"

    mySpy = mySpy + "myQuerySelf: [" + str(myQuerySelf) + "]\n"

    mySpy = mySpy + "myPostData: [" + str(myPostData) + "]\n"

    You need to define your own myPath here

    myFilename = "spy.txt"

    myFilePath = myPath + "\" + myFilename

    myFile = open(myFilePath, "w")

    myFile.write(mySpy)

    myFile.close()

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

    Here are some other useful CGI environment vars:

    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

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

    I am using this methods on Windows Server with MIIS and Python 3 in CGI mode.

    0 讨论(0)
提交回复
热议问题