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')
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.
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.
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.
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)
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With