using python to post data to a form

Karim karim.liateni at free.fr
Fri Apr 8 18:39:02 EDT 2011


On 04/04/2011 01:01 PM, Corey Richardson wrote:
> On 04/04/2011 01:36 AM, Littlefield, Tyler wrote:
>> Hello:
>> I have some data that needs to be fed through a html form to get
>> validated and processed and the like. How can I use python to send data
>> through that form, given a specific url? the form says it uses post, but
>> I"m not really sure what the difference is. would it just be:
>> http://mysite.com/bla.php?foo=bar&bar=foo?
>> If so, how do I do that with python?
>>
> import urllib
> import urllib2
>
> url = "http://www.foo.com/"
> data = {"name": "Guido", "status": "BDFL"}
>
> data = urllib.urlencode(data)
> request = urllib2.Request(url, data)
> response = urllib2.urlopen(request)
>
> page = response.read()
>
> So yeah, passing in a Request object to urlopen that has some
> urlencode'ed data in it.

Real life example:
I query for bugs:

def make_form_data(query=None):
     """Factory function to create a post form query to submit on a html 
webpage.

     @param query - the query string from the existing query list of the 
query webpage.
     """
     return {
        'init'           : EMPTY,
        'NextForm'       : EMPTY,
        'LastForm'       : FORM_QUERY,
        'ACTION'         : ACTION,
        'class'          : CLASS,
        'personalQuery'  : query,
        'sharedQuery'    : EMPTY,
        '.cgifields'     : CONFIG_QUERY,
        '.cgifields'     : SHARED_QUERY
        }

def authentication_setup(username=None, password=None, url=None):
     """Setup an authentication for a super-url (root url) on a given 
securised web server.

     @param username  - String
     @param password  - String
     @param url       - String
     """
     # Password Manager creation
     pwd_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()

     # As we set the first parameter to None
     # the Password Manager will always use
     # the same combination username/password
     # for the urls for which 'url' is a super-url.
     pwd_manager.add_password(None, url, username, password)

     # Authentication Handler creation from the Password Manager.
     auth_handler = urllib2.HTTPBasicAuthHandler(pwd_manager)

     # Opener creation from the Authentication Handler.
     opener = urllib2.build_opener(auth_handler)

     # Tous les appels a urllib2.urlopen vont maintenant utiliser le handler
     # Ne pas mettre le protocole l'URL, ou
     # HTTPPasswordMgrWithDefaultRealm sera perturbe.
     # Vous devez (bien sur) l'utiliser quand vous recuperez la page.
     urllib2.install_opener(opener)
     # l'authentification est maintenant geree automatiquement pour nous

def post_request(url=None, data=None, headers=None):
     """Post a request form on a given url web server.

     @param url       - String
     @param data      - Dictionnary
     @param headers   - Dictionnary

     @return response The web page (file) object.
     """
     if headers is None:
         headers = {
                   'User-Agent'   : __file__,
                   'Content-Type' : 'application/x-www-form-urlencoded',
                   'Accept'       : 'text/html'
                    }

     query   = urllib.urlencode(data) if data is not None else ''
     request = urllib2.Request(url, query, headers)

     response = urllib2.urlopen(request)
     #print('INFO', response.info())
     return response

AND MAIN CODE:

  try:
         webpage = post_request(url=MAIN_URL, data=make_form_data(query))
         html    = webpage.read()
         print('Authentication Information: access granted.')

except URLError, e:
         print('Authentication Information: {msg}.'.format(msg=e))
         sys.exit(1)

That's all folks Authentication+Posting a request.
make_form_data() is the most important.
To find cgi data dict you can use ClientForm.py (google it!) it is a 
good helper to find form data.

Regards
Karim



More information about the Python-list mailing list