PYTHON HTTP POST

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


On Jan 14, 2:21 pm, koranth... at gmail.com wrote:
> 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
>
>

oops - Forgot to mention that POSTing files mechanism is taken from a
recipe in active state -
http://code.activestate.com/recipes/146306/



More information about the Python-list mailing list