Skip to content

JSON serialization failed #188

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
CysIsHappy opened this issue Feb 12, 2025 · 1 comment
Open

JSON serialization failed #188

CysIsHappy opened this issue Feb 12, 2025 · 1 comment
Assignees

Comments

@CysIsHappy
Copy link

CysIsHappy commented Feb 12, 2025

version

python version: 3.11.7
flask version: 3.1.0
flask-pymongo version: 3.0.1

Code

File:/path/app/extensions.py

from flask_pymongo import PyMongo
mongo = PyMongo()

File:/path/app/init.py

from flask import Flask as _Flask
from app.extensions import mongo
class Flask(_Flask):
    from app.core.json_encoder import DefaultJSONProvider
    json_provider_class = DefaultJSONProvider

def create_app(flask_env):
    app = Flask(__name__)
    app.config.from_object(secure)
    mongo.init_app(app)
    return app

File:/path/app/core/json_encoder.py

from datetime import time as datetime_time, date as datetime_date, datetime
from flask.json.provider import DefaultJSONProvider as _DefaultJSONProvider
from app.core.error import ServerError

def _default(o):
    if hasattr(o, 'keys') and hasattr(o, '__getitem__'):
        o.lock_fileds()
        return dict(o)

    if isinstance(o, datetime):
        return o.strftime('%Y-%m-%d %H:%M:%S')

    if isinstance(o, datetime_date):
        return o.strftime('%Y-%m-%d')

    if isinstance(o, datetime_time):
        return o.strftime("%H:%M:%S")

    if isinstance(o, bytes):
        return o.decode('utf-8')
    raise ServerError()

class DefaultJSONProvider(_DefaultJSONProvider):
    default = staticmethod(_default)

ERROR:

[2025-02-12 11:07:23 +0800] [17224] [ERROR] Error handling request /v1/api_format/validators_service
Traceback (most recent call last):
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/gunicorn/workers/base_async.py", line 55, in handle
self.handle_request(listener_name, req, client, addr)
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/gunicorn/workers/ggevent.py", line 128, in handle_request
super().handle_request(listener_name, req, sock, addr)
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/gunicorn/workers/base_async.py", line 108, in handle_request
respiter = self.wsgi(environ, resp.start_response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/flask/app.py", line 1536, in call
return self.wsgi_app(environ, start_response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/flask/app.py", line 1514, in wsgi_app
response = self.handle_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/flask_cors/extension.py", line 194, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
^^^^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/flask/app.py", line 1511, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/flask/app.py", line 919, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/flask_cors/extension.py", line 194, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
^^^^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/flask/app.py", line 809, in handle_user_exception
return self.ensure_sync(handler)(e) # type: ignore[no-any-return]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/app/core/hook_func.py", line 38, in framework_error
raise error
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/flask/app.py", line 917, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/flask/app.py", line 902, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/app/api/v1/api_format.py", line 43, in validators_service
return Success(datas)
^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/app/core/error.py", line 90, in init
self.data = jsonify(data)
^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/app/core/utils.py", line 19, in jsonify
return current_app.json.response(*args, **kwargs).json
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/flask/json/provider.py", line 105, in response
return self._app.response_class(self.dumps(obj), mimetype="application/json")
^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/flask_pymongo/helpers.py", line 111, in dumps
return json_util.dumps(obj)
^^^^^^^^^^^^^^^^^^^^
File "/Users/cys/Me_cys/data/Company_data/yong_wei/project/cmdb/.venv/lib/python3.11/site-packages/bson/json_util.py", line 473, in dumps
return json.dumps(_json_convert(obj, json_options), *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/init.py", line 231, in dumps
return _default_encoder.encode(obj)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/encoder.py", line 200, in encode
chunks = self.iterencode(o, _one_shot=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/encoder.py", line 258, in iterencode
return _iterencode(o, 0)
^^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/encoder.py", line 180, in default
raise TypeError(f'Object of type {o.class.name} '
TypeError: Object of type date is not JSON serializable

@CysIsHappy
Copy link
Author

I rewrote the DefaultJSONProvider class under flask.json.provider to support dates and times. However, I noticed that flask_pymongo directly rewrites the JSONProvider base class under flask.json.provider, which causes my modified DefaultJSONProvider class to have no effect.

@Jibola Jibola self-assigned this Feb 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants