38

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')
3
  • 6
    Don't wrap the message in a Response. Return is directly. Commented Jun 8, 2017 at 8:51
  • I'm getting the same error, when I tried to send the response of the requests.post() method How can I solve this? Should I manually create my own response with the response data, status code and content type? Commented Jul 15, 2022 at 10:24
  • check this issue stackoverflow.com/questions/69531560/… Commented Jan 21, 2024 at 17:57

5 Answers 5

41

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)
Sign up to request clarification or add additional context in comments.

Comments

19

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

2 Comments

If I want render template paralalay retuen res,200,render_template() how can use this
same error for me
6

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

Comments

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

enough to solve this issue

Comments

-1

For this we can try

response=response.json()

response=json.dumps(response)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.