2017-06-08 60 views
1

我有使用Python瓶雷斯特夫爾API和數據的問題去Elasticsearch,當我發佈與郵差新的數據,問題是:瓶API類型錯誤:類型「響應」對象不是JSON序列化

類型錯誤: 「響應」類型的對象不是JSON可序列化的

你能幫助我嗎?

型號:

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

查看:

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) 

錯誤:

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 

編輯: 我發現了問題。這是在高清崗位(個體經營,people_id)方法:

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

新行:

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

不自動換'message'在'Response'中。直接返回。 –

回答

1

這可以通過簡單地做:

from flask import jsonify 
def myMethod(): 
    .... 
    response = jsonify(data) 
    response.status_code = 200 # or 400 or whatever 
    return response 
相關問題