webentwicklung-frage-antwort-db.com.de

Flask API TypeError: Objekt vom Typ 'Response' ist nicht mit JSON serialisierbar

ich habe ein Problem mit Python Flask Restful API und Daten gehen zu Elasticsearch, wenn ich neue Daten mit Postman poste, ist das Problem:

TypeError: Objekt vom Typ 'Response' ist nicht mit JSON serialisierbar

Kannst du mir helfen?

Modell:

   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()

Aussicht:

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: Ich habe ein Problem gefunden. Es war in def post (self, people_id) Methode:

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

neue Zeile:

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

Dies kann einfach durchgeführt werden durch:

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

Inspiriert von diesem Fehler , hier ist eine kürzere Möglichkeit, dies zu tun:

from flask import jsonify, make_response

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