There are several ways to do it, relying on the fact you have access to the CGI that receives the request.
The best option is to send your data as POST instead of GET. If you cannot do this for some reason, you can try to send your data with some sort of compression and decompress it at the CGI.
If the communication occurs between two servers, the first server can save data into a file, and send the filename to second server, so the CGI retrieves this file instead of reading the data from the URL.
You could adapt the CGI to receive the data into chunks, splitting the data and marking each request with some other variable, like function=doitnow&data=bytes&chunk=1&total=2&id=somekey, function=doitnow&data=more-data&chunk=2&total=2&id=somekey
Since I don't really use Python too much, I don't know how to handle POST or GET values, just if is the case, below is a wrapper to pass POST and GET values to a php script:
#!/bin/sh
echo "Content-Type: text/html;"
echo
echo
#POST=`dd count=$CONTENT_LENGTH bs=1 2> /dev/null`
POST=`dd bs=1 2> /dev/null`
php -f 'dosomething.php' -- "$POST" "$QUERY_STRING"