0

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

0 Answers0