Flask API TypeError: Object of type 'Response' is not JSON serializable
我有Python Flask Restful API的问题,数据转到Elasticsearch,当我用Postman发布新数据时,问题是:
TypeError:"Response"类型的对象不是JSON可序列化的
你能帮助我吗?
模型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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() |
视图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | 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) |
错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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) +" " 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 |
编辑:
我发现了问题。 它是def post(self,people_id)方法:
1 2 | if errors: return jsonify({'errors': errors}), 422 |
新队:
1 2 3 | if errors: message = json.dumps({'errors': errors}) return Response(message, status=422, mimetype='application/json') |
这可以通过以下方式完成:
1 2 3 4 5 6 | from flask import jsonify def myMethod(): .... response = jsonify(data) response.status_code = 200 # or 400 or whatever return response |
受这个bug的启发,这是一个更简单的方法:
1 2 3 4 5 | from flask import jsonify, make_response def myMethod(): .... return make_response(jsonify(data), 200) |