flask_restful - TypeError: Объект типа Record не JSON сериализуемый - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь предоставить пользовательский объект внутри API остальных, созданный с помощью flask_restful.

Объект: запись

import json

class Record():
    #CLASS RECORD
    def __init__(self, DateTime, DateTimeText, Status, Icon, Temp):
        #INITIALIZE
        self.DateTime = DateTime
        self.DateTimeText = DateTimeText
        self.Status = Status
        self.Icon = Icon
        self.Temp = Temp

    def __repr__(self):
        return json.dumps(self, default=lambda o: o.__dict__, sort_keys=False, indent=4)

Результат: печать (запись)

{
    "DateTime": 1583949600,
    "DateTimeText": "2020-03-11 18:00:00",
    "Status": "Clouds",
    "Icon": "04n",
    "Temp": 280.57
}

Rest API:

from flask_restful import Resource, Api, reqparse    

class _Weather(Resource):
    #WEATHER
    def get(self):
        #GET WEATHER
        return {'value': Weather.Record}

self.Api.add_resource(_Weather, '/api/weather')

Ошибка:

все остальные вызовы работают нормально, только мой пользовательский объект (http://localhost:80/api/weather) возвращает следующий стек ошибок:

File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 2463, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 2449, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask_restful\__init__.py", line 272, in error_router
    return original_handler(e)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask_cors\extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1866, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\_compat.py", line 38, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask_restful\__init__.py", line 272, in error_router
    return original_handler(e)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask_cors\extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\_compat.py", line 38, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask_restful\__init__.py", line 472, in wrapper
    return self.make_response(data, code, headers=headers)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask_restful\__init__.py", line 501, in make_response
    resp = self.representations[mediatype](data, *args, **kwargs)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask_restful\representations\json.py", line 21, in output_json
    dumped = dumps(data, **settings) + "\n"
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\json\__init__.py", line 234, in dumps
    return cls(
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\json\encoder.py", line 201, in encode
    chunks = list(chunks)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\json\encoder.py", line 431, in _iterencode
    yield from _iterencode_dict(o, _current_indent_level)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\json\encoder.py", line 405, in _iterencode_dict
    yield from chunks
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\json\encoder.py", line 438, in _iterencode
    o = _default(o)
  File "C:\Users\Martin\AppData\Local\Programs\Python\Python38-32\Lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type Record is not JSON serializable

Я пробую много разных подходов, найденных здесь в стеке. Ни одна из этих работ для моего.

Python 3.8.2

1 Ответ

1 голос
/ 11 марта 2020

У вас есть несколько вариантов здесь.

  1. Создайте метод to json () для вашего класса Record и вызовите его для возвращаемого значения. Он просто вернет базовый __dict__ для вашего объекта.
def tojson(self):
    return self.__dict__
Передайте Weather.Record.__dict__ непосредственно в качестве возвращаемого значения

Таким образом, ваше выражение возврата будет выглядеть следующим образом:

return {'value': Weather.Record.__dict__}

Или, используя jsonify от Flask:

return jsonify({'value': 'Weather.Record.__dict__})

Или замените Weather.Record .__ dict__ на Weather.Record.to json (), если вы добавите этот метод в класс.

...