Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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')
like image 229
webteroyal Avatar asked Jun 08 '17 08:06

webteroyal


People also ask

How do I make an object JSON serializable?

Use toJSON() Method to make class JSON serializable So we don't need to write custom JSONEncoder. This new toJSON() serializer method will return the JSON representation of the Object. i.e., It will convert custom Python Object to JSON string.

What is not JSON serializable?

The Python "TypeError: Object of type function is not JSON serializable" occurs when we try to serialize a function to JSON. To solve the error, make sure to call the function and serialize the object that the function returns. Here is an example of how the error occurs. main.py.

How do you serialize an object to JSON in Python?

The json module exposes two methods for serializing Python objects into JSON format. dump() will write Python data to a file-like object. We use this when we want to serialize our Python data to an external JSON file. dumps() will write Python data to a string in JSON format.


2 Answers

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)
like image 158
rouble Avatar answered Oct 23 '22 17:10

rouble


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
like image 18
Namrata Tolani Avatar answered Oct 23 '22 18:10

Namrata Tolani