Skip to main content

A simple asynchronous task manager based on the Django framework. All business logic written in a custom task data model. Tasks are triggered by a Redis queue.

Project description

django-simpletask2

A simple asynchronous task manager based on the Django framework. All business logic written in a custom task data model. Tasks are triggered by a Redis queue.

Install

pip install django-simpletask2

Usage

pro/settings.py

INSTALLED_APPS = [
    ...
    'django_simpletask2',
    ...
]

# requires redis cache backend, see django-redis for detail
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:xxx@xxx:6379/0?decode_responses=True",
    }
}

DJANGO_SIMPLETASK2_TASK_PULL_TIMEOUT = 5 # optional, default to 5
DJANGO_SIMPLETASK2_REDIS_NAME = "default" # optional, default to "default"
DJANGO_SIMPLETASK2_ACLKEY = "Bqud27SzhUymXDuBfvYNHJWQm0i4FdUB" # optional, default to settings.SECRET_KEY

pro/urls.py

from django.urls import path
from django.urls import include

urlpatterns = [
    ...
    path('django-simpletask2/', include("django_simpletask2.urls")),
    ....
]

app/models.py

import base64
from django.db import models
from django_simpletask2.models import SimpleTask


class HelloTask(SimpleTask):
    name = models.CharField(max_length=64)

    def do_task_main(self, payload):
        return "Hello, {}. Nice to meet you!".format(self.name)

class WorldTask(SimpleTask):
    url = models.CharField(max_length=128)
    content = models.TextField(null=True, blank=True)

    is_multi_steps = True
    final_step = 2

    def do_task_main_step1(self, payload=None):
        return {
            "proxy": {
                "method": "GET",
                "url": self.url,
            }
        }
    
    def do_task_main_step2(self, payload=None):
        payload = payload or {}
        base64content = payload.get("proxied_content", None)
        if base64content:
            try:
                content = base64.decodebytes(base64content.encode()).decode("utf-8")
                success = True
            except UnicodeDecodeError:
                try:
                    content = base64.decodebytes(base64content.encode()).decode("gb18030")
                    success = True
                except UnicodeDecodeError:
                    content = "failed to decode proxied_content: {0}".format(base64content)
                    success = False
        else:
            content = payload.get("proxied_error", None)
            success = False

        self.content = content
        self.save()

        if success:
            return True
        else:
            raise RuntimeError("WorldTask.do_task_main_step2 failed....")

etc/django-simpletask2-server-config.yml

redis: "redis://:xxx@xxx:6379/0?decode_responses=True"
channels: default
server: https://localhost:80000/django-simpletask2/
aclkey: xxxx
task-pull-engine: redis
threads: 1
idle-sleep: 5
error-sleep: 5
auto-reset-task-interval: 60
do-auto-reset-task: true

Start django-simpletask2-server to trigger tasks

django-simpletask2-server --config etc/django-simpletask2-server-config.yml start

Error Codes

Code Message
2910000 system error.
2910001 please send request parameters in PAYLOAD format.
2910002 aclkey field is required.
2910003 aclkey is wrong and access denied.
2910004 got an already deleted task {task_info}, you may ignore this and continue.
2910005 bad formatted task_info: {task_info}.
2910006 Simple task model {task_class_name} not exists.
2910007 task handler is not implemented, task={app_label}.{model_name}, handler={}.
2910008 task status is not READY but {status}, you can not start it.
2910009 calling {handler_name} failed with error message: {error}.
2910010 save task done status failed with error message: {error}.
2910011 task_info field is required for a multi-steps task. payload={payload}.
2910012 got NO task in channels: {channels}.
2910013 task {task_info} locked by another worker.
2910014 task {app_label}.{model_name}:{task_id} failed to save status with error message: {error}.
2910015 task_info field is required.
2910016 get task instance {task_info} failed with error: {error}.

Releases

v0.0.1

  • First release.

v0.0.4

  • Fixed the problem that the task duplicately executed for the task queue is too long.

v0.0.5

  • Fix do_task problem in actions.
  • Fix ugettext_lazy problem.
  • Fix problems in django 4.x.

v0.0.6

  • Doc update.

v0.0.7

  • Fix error message formatting problem.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-simpletask2-0.0.7.tar.gz (13.6 kB view details)

Uploaded Source

Built Distribution

django_simpletask2-0.0.7-py3-none-any.whl (15.6 kB view details)

Uploaded Python 3

File details

Details for the file django-simpletask2-0.0.7.tar.gz.

File metadata

  • Download URL: django-simpletask2-0.0.7.tar.gz
  • Upload date:
  • Size: 13.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.12.0rc1

File hashes

Hashes for django-simpletask2-0.0.7.tar.gz
Algorithm Hash digest
SHA256 4428896f280c1fd0ff50bae81625663748d3a4076e0fbcd9c1903674ee6913e6
MD5 738f65d10a61403ea802b7e181acc727
BLAKE2b-256 80bc64134cf0d6f74c227d51036997103201e7adb1d7d0f09fd252d9c5f74b71

See more details on using hashes here.

File details

Details for the file django_simpletask2-0.0.7-py3-none-any.whl.

File metadata

File hashes

Hashes for django_simpletask2-0.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 f86954d5aa58d3c9d6f0703dea8c1a2bb8b2b5ff94f747add5275015a2f46b43
MD5 389fb411a7e9751c00975b36d3b07773
BLAKE2b-256 00cf7f9e224bfe13295e61dd0dae1d803252b645e29235d699f8229875b58995

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page