PYTHON HTTP POST

koranthala at gmail.com koranthala at gmail.com
Wed Jan 14 10:21:58 CET 2009


Does google accept POST?

Anyways, if you dont need to post files, you can use urlencode itself.
def encode_formdata(fields):
        body = urllib.urlencode(dict(<fields>))
        content_type = "application/x-www-form-urlencoded"
        return content_type, body

If you need to post files too, then you will have to use multipart
data
def encode_multipart_formdata(fields, files):
    """
    fields is a sequence of (name, value) elements for regular form
fields.
    files is a sequence of (name, filename, value) elements for data
to be uploaded as files
    Return (content_type, body) ready for httplib.HTTP instance
    """
    BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
    CRLF = '\r\n'
    L = []
    for (key, value) in fields:
        L.append('--' + BOUNDARY)
        L.append('Content-Disposition: form-data; name="%s"' % key)
        L.append('')
        L.append(value)
    for (key, filename, value) in files:
        L.append('--' + BOUNDARY)
        L.append('Content-Disposition: form-data; name="%s";
filename="%s"' % (key, filename))
        L.append('Content-Type: %s' % mimetypes.guess_type(filename)
[0] or 'application/octet-stream'
        L.append('')
        L.append(value)
    L.append('--' + BOUNDARY + '--')
    L.append('')
    body = CRLF.join(L)
    content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
    return content_type, body

Since POST files doesnt work with urllib, you might have to use
httplib - or go for very high level tools like twisted.
I here show an example with httplib.

def post(host, selector, fields, files):
    if files:
       content_type, body = encode_multipart_formdata(fields, files)
    else:
       content_type, body = encode_formdata(fields)

    h = httplib.HTTPConnection(host)
    #Spoof Mozilla
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4',
        'Content-Type': content_type
        }
    h.request('POST', selector, body, headers)
    res = h.getresponse()
    return res.status, res.reason, res.read()

Please note that you can use multipart whether or not files are there,
but parsing multipart usually is slower.

Hope this helps.

lilanidha... at gmail.com wrote:
> Hi,
>
> I need one complete example of how to do a http post to any site.
> I have tried making a POST to google but all I am returned with is a
> 405 error.
> I don't want to use Pygoogle as I want to try and do this with other
> sites.
> I am also having problems inputing with the param
> I have tried Mechanize. There are no problems with getting data only
> posting.
>
> >>> headers = {'Content-Type': 'text/html; charset=ISO-8859-1',
> ...         'User-Agent':'Mozilla/4.0',
> ...         'Content-Length':'7'}
> >>> conn = httplib.HTTPConnection("www.google.com")
> >>> conn.request("POST","/search",params,headers)
> >>> r2 =  conn.getresponse()
> >>> print r2.status, r2.reason
> 405 Method Not Allowed
>
> Regards,
> Dhaval



More information about the Python-list mailing list