For my project (Django-based online shop backend) I implemented a simulated order payment. For practice I decided to use Dramatiq to practice with asynchronous task execution. Here is my code (app_payment/views.py):
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from tasks import post_func_for_payment, backend
class PaymentAPIView(APIView):
def post(self, request, *args, **kwargs):
result = post_func_for_payment.send(request.data, kwargs['id'])
response = result.get_result(backend=backend)
data_dict = response['data']
return Response(data=data_dict, status=status.HTTP_200_OK)
app_payment/tasks.py:
import os
import django
from rest_framework.response import Response
from dramatiq.results import Results
from dramatiq.results.backends import RedisBackend
import dramatiq
backend = RedisBackend()
broker = dramatiq.get_broker()
broker.add_middleware(Results(backend=backend))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "megano.settings")
django.setup()
from app_order.models import Order
@dramatiq.actor(store_results=True)
def post_func_for_payment(data, id):
order = Order.objects.get(pk=id)
number = data['number']
if int(number[-1]) % 2 != 0 or len(number) != 16:
order.status = 'Unpaid'
return Response(status=400)
data_dict = {
"number": number,
"name": data['name'],
"month": data['month'],
"year": data['year'],
"code": data['code']
}
order.status = 'Paid'
order.save()
return {'status': order.status, 'data': data_dict}
Part of the settings.py code:
DRAMATIQ_BROKER = 'dramatiq.brokers.rabbitmq.RabbitmqBroker'
DRAMATIQ_BROKER_URL = 'amqp://guest:guest@localhost:5672//'
DRAMATIQ_RESULT_BACKEND = "dramatiq.results.backends.redis.RedisBackend"
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
DRAMATIQ_REDIS_BACKEND_CONFIG = {
"url": f"redis://{REDIS_HOST}:{REDIS_PORT}",
}
However, I get the following error when I try to pay for the order:
Internal Server Error: /api/payment/26
Traceback (most recent call last):
File "/mnt/c/Users/Victor/PycharmProjects/python_django_diploma/my_venv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/mnt/c/Users/Victor/PycharmProjects/python_django_diploma/my_venv/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/mnt/c/Users/Victor/PycharmProjects/python_django_diploma/my_venv/lib/python3.10/site-packages/django/views/decorators/csrf.py", line 56, in wrapper_view
return view_func(*args, **kwargs)
File "/mnt/c/Users/Victor/PycharmProjects/python_django_diploma/my_venv/lib/python3.10/site-packages/django/views/generic/base.py", line 104, in view
return self.dispatch(request, *args, **kwargs)
File "/mnt/c/Users/Victor/PycharmProjects/python_django_diploma/my_venv/lib/python3.10/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/mnt/c/Users/Victor/PycharmProjects/python_django_diploma/my_venv/lib/python3.10/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/mnt/c/Users/Victor/PycharmProjects/python_django_diploma/my_venv/lib/python3.10/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/mnt/c/Users/Victor/PycharmProjects/python_django_diploma/my_venv/lib/python3.10/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/mnt/c/Users/Victor/PycharmProjects/python_django_diploma/megano/app_payment/views.py", line 16, in post
response = result.get_result(backend=backend)
File "/mnt/c/Users/Victor/PycharmProjects/python_django_diploma/my_venv/lib/python3.10/site-packages/dramatiq/message.py", line 173, in get_result
return backend.get_result(self, block=block, timeout=timeout)
File "/mnt/c/Users/Victor/PycharmProjects/python_django_diploma/my_venv/lib/python3.10/site-packages/dramatiq/results/backends/redis.py", line 86, in get_result
raise ResultMissing(message)
dramatiq.results.errors.ResultMissing: post_func_for_payment({'name': 'Test Test Test', 'number': '2222222222222222', 'year': '23', 'month': '12', 'code': '000'}, 26)
What could this error be related to and how to fix it? I know very little about redis, rabbitmq and dramatiq, so the error is probably obvious and silly. Please forgive this and help me as much as you can :)
I've checked Redis access with ping (nothing wrong), monitored what comes from asynchronous function (function name and parameters), tried setting 5-second timers in some places (no effect), added DRAMATIQ_REDIS_BACKEND_CONFIG variable (no effect), restarted redis, rabbitmq, dramatiq and django (no effect).