How to read an image sent in body of req in falcon

343 Views Asked by At

Sending jpg image in body of POST, using postman to do so:

enter image description here

Reading it with image_text_similarity.py:

import json
class ImageTextSimilarity():
    def on_post(self, req, resp):
        image_raw = json.loads(req.stream.read())

which errors out with

Traceback (most recent call last):
  File "/home/dario/.local/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 134, in handle
    self.handle_request(listener, req, client, addr)
  File "/home/dario/.local/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 175, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "falcon/api.py", line 274, in falcon.api.API.__call__
  File "falcon/api.py", line 269, in falcon.api.API.__call__
  File "/home/dario/ImageTextSimilarityApp/image_text_similarity.py", line 95, in on_post
    image_raw = json.loads(req.stream.read())
  File "/usr/lib/python3.6/json/__init__.py", line 349, in loads
    s = s.decode(detect_encoding(s), 'surrogatepass')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

How do we read the image from the body of the POST request?

Rest of the code is image_similarity_app.py:

import falcon
from image_text_similarity import ImageTextSimilarity

api = application = falcon.API()
api.req_options.auto_parse_form_urlencoded = True
image_text_similarity_object = ImageTextSimilarity()
api.add_route('/image_text_similarity', image_text_similarity_object)

And starting the service with gunicorn image_similarity_app

1

There are 1 best solutions below

0
On

I'm not an expert at Postman, but it appears that by choosing binary, you are sending your JPEG image data as the request body: Postman Chrome: What is the difference between form-data, x-www-form-urlencoded and raw

In Falcon, you can simply read the request payload as

jpeg_data = req.stream.read()

(Note that on some app servers such as the stdlib's wsgiref.simple_server, you may need to use the safe Request.bounded_stream wrapper.)

See also Falcon's WSGI and ASGI tutorials for inspiration; they use are very related topic (building an image service) to illustrate the basic concepts of the framework. You'll find examples how to handle RESTful image resources: upload, convert, store, list, serve, cache etc.