Flask API TypeError: Object of type 'Response' is not JSON serializable

83,479

Solution 1

Inspired from this bug, here is a shorter way of doing it:

from flask import jsonify, make_response

def myMethod():
    ....
    return make_response(jsonify(data), 200)

Solution 2

This can be simply done by:

from flask import jsonify
def myMethod():
    ....
    response = jsonify(data)
    response.status_code = 200 # or 400 or whatever
    return response

Solution 3

I had a similar problem, the problem is that i was using jsonify twice (jsonify(jsonify({abc:123})))

Solution 4

def post(self):
    some_json=request.get_json()
    return jsonify({'you sent ':some_json})

enough to solve this issue

Share:
83,479
Admin
Author by

Admin

Updated on July 11, 2022

Comments

  • Admin
    Admin almost 2 years

    i have a problem with Python Flask Restful API and data goes to Elasticsearch, when i post a new data with Postman, problem is:

    TypeError: Object of type 'Response' is not JSON serializable

    Can you help me?

    Model:

       from marshmallow import Schema, fields, validate
    
    class Person(object):
        def __init__(self,tcno=None,firstname=None,lastname=None,email=None,birthday=None,country=None,gender=None):
            self.__tcno = tcno
            self.__firstname = firstname
            self.__lastname = lastname
            self.__email = email
            self.__birthday = birthday
            self.__country = country
            self.__gender = gender
    
        def __repr__(self):
            return '<Person(firstname={self.__firstname!r})>'.format(self=self)
    
    class PersonSchema(Schema):
        tcno = fields.Str(required=True,validate=[validate.Length(min=11, max=11)])
        firstname = fields.Str(required=True)
        lastname = fields.Str(required=True)
        email = fields.Email(required=True,validate=validate.Email(error="Not a valid email"))
        birthday = fields.Date(required=True)
        country = fields.Str()
        gender = fields.Str()
    

    View:

    from flask import Response, json, request, jsonify, Flask
    import requests
    from flask_marshmallow import Marshmallow
    from flask_restful import Api, Resource
    
    from Person import Person, PersonSchema
    
    app = Flask(__name__)
    api = Api(app)
    ma = Marshmallow(app)
    
    class Apici(Resource):
        def __init__(self):
            pass
    
        def get(self,people_id):
            url = "http://localhost:9200/people/person/{}".format(people_id)
            headers = {"Content-type": "application/json"}
            r = requests.get(url=url, headers=headers)
            json_data = json.loads(r.text)
            if json_data['found'] is False:
                mesaj = json.dumps({"found": "False"})
                resp = Response(mesaj, status=201, mimetype='application/json')
                return resp
            return json_data["_source"]
    
        def post(self,people_id):
            json_input = request.get_json()
            person_schema = PersonSchema()
            person, errors = person_schema.load(json_input)
            if errors:
                return jsonify({'errors': errors}), 422
            #result = person_schema(person)
            url = "http://localhost:9200/people/person/{}".format(people_id)
            headers = {"Content-type": "application/json"}
            print(url)
    
            r = requests.post(url=url, json=json_input, headers=headers)
            print(r)
            json_data = json.loads(r.text)
            if json_data["result"] is "Updated":
                message = json.loads({"result": "updated"})
                resp = Response(message, status=201, mimetype='application/json')
                return resp
            message = json.loads({"result": "created"})
            resp = Response(message, status=201, mimetype='application/json')
            return resp #jsonify(result.data)
    
        def put(self):
            json_input = request.get_json()
            person_schema = PersonSchema()
            person, errors = person_schema.load(json_input)
            if errors:
                return jsonify({'errors': errors}), 422
            result = person_schema(person)
            url = "http://localhost:9200/people/person/{}".format(request.url[-1])
            headers = {"Content-type": "application/json"}
            r = requests.post(url=url, json=json_input, headers=headers)
            json_data = json.loads(r.text)
            if json_data["result"] is "Updated":
                message = json.dumps({"result": "updated"})
                resp = Response(message, status=201, mimetype='application/json')
                return resp
            message = json.dumps({"result": "created"})
            resp = Response(message, status=201, mimetype='application/json')
            return resp #jsonify(result.data)
    
        def delete(self):
            url = "http://localhost:9200/people/person/{}".format(request.url[-1])
            headers = {"Content-type": "application/json"}
            r = requests.delete(url=url,headers=headers)
            json_data = json.loads(r.text)
            if json_data["result"] == "not_found":
                message = json.dumps({"result": "not_found"})
                return Response(message, status=201, mimetype='application/json')
            message = json.dumps({"result": "deleted"})
            resp = Response(message, status=201, mimetype='application/json')
            return resp
    
    
    class ApiciList(Resource):
        def __init__(self):
            pass
    
        def get(self):
            url = "http://localhost:9200/people/person/_search"
            body = {"query": {"match_all": {}}}
            headers = {"Content-type": "application/json"}
            r = requests.get(url=url, json=body, headers=headers)
            json_data = json.loads(r.text)
            return json_data["hits"]["hits"]
    
    
    api.add_resource(ApiciList, '/person')
    api.add_resource(Apici, '/person/<string:people_id>')
    
    
    if __name__ == '__main__':
        app.run(port=5010,debug=True)
    

    Error:

    127.0.0.1 - - [08/Jun/2017 11:37:18] "POST /person/1 HTTP/1.1" 500 -
    Traceback (most recent call last):
      File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1997, in __call__
        return self.wsgi_app(environ, start_response)
      File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1985, in wsgi_app
        response = self.handle_exception(e)
      File "/usr/local/lib/python3.6/dist-packages/flask_restful/__init__.py", line 271, in error_router
        return original_handler(e)
      File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1540, in handle_exception
        reraise(exc_type, exc_value, tb)
      File "/usr/local/lib/python3.6/dist-packages/flask/_compat.py", line 32, in reraise
        raise value.with_traceback(tb)
      File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1982, in wsgi_app
        response = self.full_dispatch_request()
      File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1614, in full_dispatch_request
        rv = self.handle_user_exception(e)
      File "/usr/local/lib/python3.6/dist-packages/flask_restful/__init__.py", line 271, in error_router
        return original_handler(e)
      File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1517, in handle_user_exception
        reraise(exc_type, exc_value, tb)
      File "/usr/local/lib/python3.6/dist-packages/flask/_compat.py", line 32, in reraise
        raise value.with_traceback(tb)
      File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1612, in full_dispatch_request
        rv = self.dispatch_request()
      File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1598, in dispatch_request
        return self.view_functions[rule.endpoint](**req.view_args)
      File "/usr/local/lib/python3.6/dist-packages/flask_restful/__init__.py", line 481, in wrapper
        return self.make_response(data, code, headers=headers)
      File "/usr/local/lib/python3.6/dist-packages/flask_restful/__init__.py", line 510, in make_response
        resp = self.representations[mediatype](data, *args, **kwargs)
      File "/usr/local/lib/python3.6/dist-packages/flask_restful/representations/json.py", line 20, in output_json
        dumped = dumps(data, **settings) + "\n"
      File "/usr/lib/python3.6/json/__init__.py", line 238, in dumps
        **kw).encode(obj)
      File "/usr/lib/python3.6/json/encoder.py", line 201, in encode
        chunks = list(chunks)
      File "/usr/lib/python3.6/json/encoder.py", line 437, in _iterencode
        o = _default(o)
      File "/usr/lib/python3.6/json/encoder.py", line 180, in default
        o.__class__.__name__)
    TypeError: Object of type 'Response' is not JSON serializable
    

    EDIT: I found problem. It was in def post(self,people_id) method:

       if errors:
            return jsonify({'errors': errors}), 422
    

    new line:

    if errors:
        message = json.dumps({'errors': errors})
        return Response(message, status=422, mimetype='application/json')