Bogdanp / django_dramatiq

A Django app that integrates with Dramatiq.
https://dramatiq.io
Other
347 stars 77 forks source link

Object of type 'date' is not JSON serializable #61

Closed kausality closed 4 years ago

kausality commented 4 years ago

OS: WSL Version: 0.9.1

Code:

def summary():
    symbols = helpers.get_all_symbols()
    categories = ['PE', 'QUOTE', 'YAHOO_SUMMARY']
    dt = date.today()
    for symbol in symbols:
        for category in categories:
            tasks.task_summary.send(symbol, category, dt)

Result:

Launching subshell in virtual environment…
 . /home/kaustubh/.local/share/virtualenvs/backend-Y9BoGL3h/bin/activate
cd alphathon/backend
kaustubh@andromeda:~$  . /home/kaustubh/.local/share/virtualenvs/backend-Y9BoGL3h/bin/activate
(backend) kaustubh@andromeda:~$ cd alphathon/backend
(backend) kaustubh@andromeda:~/alphathon/backend$ python manage.py run summary
Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/home/kaustubh/.local/share/virtualenvs/backend-Y9BoGL3h/lib/python3.6/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/home/kaustubh/.local/share/virtualenvs/backend-Y9BoGL3h/lib/python3.6/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/kaustubh/.local/share/virtualenvs/backend-Y9BoGL3h/lib/python3.6/site-packages/django/core/management/base.py", line 328, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/kaustubh/.local/share/virtualenvs/backend-Y9BoGL3h/lib/python3.6/site-packages/django/core/management/base.py", line 369, in execute
    output = self.handle(*args, **options)
  File "/mnt/d/main/gdrive/core/alphathon/backend/bravo/management/commands/run.py", line 13, in handle
    runners.summary()
  File "/mnt/d/main/gdrive/core/alphathon/backend/bravo/runners.py", line 20, in summary
    tasks.task_summary.send(symbol, category, dt)
  File "/home/kaustubh/.local/share/virtualenvs/backend-Y9BoGL3h/lib/python3.6/site-packages/dramatiq/actor.py", line 111, in send
    return self.send_with_options(args=args, kwargs=kwargs)
  File "/home/kaustubh/.local/share/virtualenvs/backend-Y9BoGL3h/lib/python3.6/site-packages/dramatiq/actor.py", line 130, in send_with_options
    return self.broker.enqueue(message, delay=delay)
  File "/home/kaustubh/.local/share/virtualenvs/backend-Y9BoGL3h/lib/python3.6/site-packages/dramatiq/brokers/rabbitmq.py", line 310, in enqueue
    body=message.encode(),
  File "/home/kaustubh/.local/share/virtualenvs/backend-Y9BoGL3h/lib/python3.6/site-packages/dramatiq/message.py", line 101, in encode
    return global_encoder.encode(self._asdict())
  File "/home/kaustubh/.local/share/virtualenvs/backend-Y9BoGL3h/lib/python3.6/site-packages/dramatiq/encoder.py", line 49, in encode
    return json.dumps(data, separators=(",", ":")).encode("utf-8")
  File "/usr/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'date' is not JSON serializable

The date parameter being passed to the actor cannot be serialized. What should be done?

Bogdanp commented 4 years ago

You need to use a custom encoder (such as the pickle encoder). Set it via the DRAMATIQ_ENCODER setting in your settings.py.