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.

v0.0.8

  • Push to mq after instance-create-transaction committed.

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.8.tar.gz (13.8 kB view details)

Uploaded Source

Built Distribution

django_simpletask2-0.0.8-py3-none-any.whl (15.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: django-simpletask2-0.0.8.tar.gz
  • Upload date:
  • Size: 13.8 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.8.tar.gz
Algorithm Hash digest
SHA256 71d77e094b7aa09e88bd1fe44affda4fc1cc89622c4cb43e58e49bd88b9789d2
MD5 009c69655fc2b562289265cf9b04f554
BLAKE2b-256 7cf6176be047ad696c7ce7f1b4fc356757b435e2e176af42ee7d99a733be5aec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for django_simpletask2-0.0.8-py3-none-any.whl
Algorithm Hash digest
SHA256 6fa943f5dc1d313164dc46dd2b14000f9f7184defe4b2d821bad17bcedece022
MD5 a564ced6126b2ecbca161853dd99dd91
BLAKE2b-256 4eb6421bf1464106f715b8216413b8ba84cbfa979633ab52afa1d5f37f6d68fa

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