Search code examples
pythonpostmanflask-restful

Postman, Python and passing images and metadata to a web service


this is a two-part question: I have seen individual pieces discussed, but can't seem to get the recommended suggestions to work together. I want to create a web service to store images and their metadata passed from a caller and run a test call from Postman to make sure it is working. So to pass an image (Drew16.jpg) to the web service via Postman, it appears I need something like this:

Postman Configuration

For the web service, I have some python/flask code to read the request (one of many variations I have tried):

from flask import Flask, jsonify, request, render_template
from flask_restful import Resource, Api, reqparse

...

def post(self, name):
    request_data = request.get_json()
    userId = request_data['UserId']
    type = request_data['ImageType']
    image = request.files['Image']

Had no problem with the data portion and straight JSON but adding the image has been a bugger. Where am I going wrong on my Postman config? What is the actual set of Python commands for reading the metadata and the file from the post? TIA


Solution

  • Pardon the almost blog post. I am posting this because while you can find partial answers in various places, I haven't run across a complete post anywhere, which would have saved me a ton of time. The problem is you need both sides to the story in order to verify either.

    So I want to send a request using Postman to a Python/Flask web service. It has to have an image along with some metadata.

    Here are the settings for Postman (URL, Headers):

    enter image description here

    And Body:

    enter image description here

    Now on to the web service. Here is a bare bones service which will take the request, print the metadata and save the file:

    from flask import Flask, request
    
    app = Flask(__name__)        
    
    # POST - just get the image and metadata
    @app.route('/RequestImageWithMetadata', methods=['POST'])
    def post():
        request_data = request.form['some_text']
        print(request_data)
        imagefile = request.files.get('imagefile', '')
        imagefile.save('D:/temp/test_image.jpg')
        return "OK", 200
    
    app.run(port=5000)
    

    Enjoy!