Search code examples
pythongoogle-app-enginewebapp2google-mirror-api

How to get data from webapp2.Request


I am having trouble sending a string of bytes (an image) to my backend.

In my code I have:

#  sends a httplib2.Request
backend_resp, backend_content = self.mirror_service._http.request(
                                uri=backend_path, 
                                body=urllib.urlencode({"img":content}))

This sends a request where content is a large string of bytes.

in my backend I have:

class Handler(webapp2.RequestHandler):
  def get(self):
    image_bytes = self.request.get("img")
    logging.info(image_bytes) # output is empty string

Which logs an empty string.

I have also tried

image_bytes = self.request.body

and just setting body = content in the request, but these also return nothing

I know the backend is receiving the request because the backend logs have messages I have placed.

What is the correct way to send and retrieve my GET data?

EDIT:

Here's what content logs before trying to send it to my backend:

logging.info(str(type(content)))
# returns <type 'str'>

logging.info(content)
# logs a long string of bytes

On another note, I also get this warning in the logs when sending the request, but I'm not sure how to fix it:

new_request() takes at most 1 positional argument (2 given)

I'm guessing that this warning means that the 1 positional argument it takes is path=, and it's ignoring my body= argument. I think the warning changes to (3 given) if I add method="POST" or method="GET"

I tried using a POST method too, but logging.info won't display in my logs. I tried just writing self.request.body or self.request.get('img') back to the response, and it still just returns an empty string like the GET method.


Solution

  • To send a post from httplib2 :

    import urllib
    import httplib2
    
    http = httplib2.Http()
    
    url = '<your post url>'   
    body = {'img': 'all your image bytes...'}
    headers = {'Content-type': 'application/x-www-form-urlencoded'}
    response, content = http.request(url, 'POST', headers=headers, body=urllib.urlencode(body))
    

    see httplib2 docs

    To receive a post in Webapp2:

    class Handler(webapp2.RequestHandler):
      def post(self):
        image_bytes = self.request.POST.get("img")
        logging.info(image_bytes) # output is empty string
    

    I haven't tested this code, but it should give you and idea how it should be done.