A multiprocessing distributed task queue for Django

Related tags

Djangodjango-q
Overview
Q logo

A multiprocessing distributed task queue for Django

image0 image1 Documentation Status image2

Features

  • Multiprocessing worker pool
  • Asynchronous tasks
  • Scheduled, cron and repeated tasks
  • Signed and compressed packages
  • Failure and success database or cache
  • Result hooks, groups and chains
  • Django Admin integration
  • PaaS compatible with multiple instances
  • Multi cluster monitor
  • Redis, Disque, IronMQ, SQS, MongoDB or ORM
  • Rollbar and Sentry support

Requirements

Tested with: Python 3.7, 3.8 Django 2.2.X and 3.1.X

Warning

Since Python 3.7 async became a reserved keyword and was refactored to async_task

Brokers

Installation

  • Install the latest version with pip:

    $ pip install django-q
    
  • Add django_q to your INSTALLED_APPS in your projects settings.py:

    INSTALLED_APPS = (
        # other apps
        'django_q',
    )
    
  • Run Django migrations to create the database tables:

    $ python manage.py migrate
    
  • Choose a message broker , configure and install the appropriate client library.

Read the full documentation at https://django-q.readthedocs.org

Configuration

All configuration settings are optional. e.g:

# settings.py example
Q_CLUSTER = {
    'name': 'myproject',
    'workers': 8,
    'recycle': 500,
    'timeout': 60,
    'compress': True,
    'cpu_affinity': 1,
    'save_limit': 250,
    'queue_limit': 500,
    'label': 'Django Q',
    'redis': {
        'host': '127.0.0.1',
        'port': 6379,
        'db': 0, }
}

For full configuration options, see the configuration documentation.

Management Commands

Start a cluster with:

$ python manage.py qcluster

Monitor your clusters with:

$ python manage.py qmonitor

Check overall statistics with:

$ python manage.py qinfo

Creating Tasks

Use async_task from your code to quickly offload tasks:

from django_q.tasks import async_task, result

# create the task
async_task('math.copysign', 2, -2)

# or with a reference
import math.copysign

task_id = async_task(copysign, 2, -2)

# get the result
task_result = result(task_id)

# result returns None if the task has not been executed yet
# you can wait for it
task_result = result(task_id, 200)

# but in most cases you will want to use a hook:

async_task('math.modf', 2.5, hook='hooks.print_result')

# hooks.py
def print_result(task):
    print(task.result)

For more info see Tasks

Schedule

Schedules are regular Django models. You can manage them through the Admin page or directly from your code:

# Use the schedule function
from django_q.tasks import schedule

schedule('math.copysign',
         2, -2,
         hook='hooks.print_result',
         schedule_type=Schedule.DAILY)

# Or create the object directly
from django_q.models import Schedule

Schedule.objects.create(func='math.copysign',
                        hook='hooks.print_result',
                        args='2,-2',
                        schedule_type=Schedule.DAILY
                        )

# Run a task every 5 minutes, starting at 6 today
# for 2 hours
import arrow

schedule('math.hypot',
         3, 4,
         schedule_type=Schedule.MINUTES,
         minutes=5,
         repeats=24,
         next_run=arrow.utcnow().replace(hour=18, minute=0))

# Use a cron expression
schedule('math.hypot',
         3, 4,
         schedule_type=Schedule.CRON,
         cron = '0 22 * * 1-5')

For more info check the Schedules documentation.

Testing

To run the tests you will need the following in addition to install requirements:

The following commands can be used to run the tests:

# Create virtual environment
python -m venv venv

# Install requirements
venv/bin/pip install -r requirements.txt

# Install test dependencies
venv/bin/pip install pytest pytest-django

# Install django-q
venv/bin/python setup.py develop

# Run required services (you need to have docker-compose installed)
docker-compose -f test-services-docker-compose.yaml up -d

# Run tests
venv/bin/pytest

# Stop the services required by tests (when you no longer plan to run tests)
docker-compose -f test-services-docker-compose.yaml down

Locale

Currently available in English and French. Translation pull requests are always welcome.

Todo

  • Better tests and coverage
  • Less dependencies?

Acknowledgements

Comments
  • TypeError: can't pickle _thread.lock objects

    TypeError: can't pickle _thread.lock objects

    Django 2.2.11 python 3.7.0 django-q 1.2.1 windows 10

    Hello, when i run manage.py qcluster i get error, does somebody know what could be source of it and how to resolve it?

      File "manage.py", line 21, in <module>
        main()
      File "manage.py", line 17, in main
        execute_from_command_line(sys.argv)
      File "C:\Users\Mateusz\Desktop\project\env\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
        utility.execute()
      File "C:\Users\Mateusz\Desktop\project\env\lib\site-packages\django\core\management\__init__.py", line 375, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "C:\Users\Mateusz\Desktop\project\env\lib\site-packages\django\core\management\base.py", line 323, in run_from_argv
        self.execute(*args, **cmd_options)
      File "C:\Users\Mateusz\Desktop\project\env\lib\site-packages\django\core\management\base.py", line 364, in execute
        output = self.handle(*args, **options)
      File "C:\Users\Mateusz\Desktop\project\env\lib\site-packages\django_q\management\commands\qcluster.py", line 22, in handle
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\Mateusz\AppData\Local\Programs\Python\Python37\lib\multiprocessing\spawn.py", line 105, in spawn_main
        exitcode = _main(fd)
      File "C:\Users\Mateusz\AppData\Local\Programs\Python\Python37\lib\multiprocessing\spawn.py", line 115, in _main
        self = reduction.pickle.load(from_parent)
    EOFError: Ran out of input
        q.start()
      File "C:\Users\Mateusz\Desktop\project\env\lib\site-packages\django_q\cluster.py", line 65, in start
        self.sentinel.start()
      File "C:\Users\Mateusz\AppData\Local\Programs\Python\Python37\lib\multiprocessing\process.py", line 112, in start
        self._popen = self._Popen(self)
      File "C:\Users\Mateusz\AppData\Local\Programs\Python\Python37\lib\multiprocessing\context.py", line 223, in _Popen
        return _default_context.get_context().Process._Popen(process_obj)
      File "C:\Users\Mateusz\AppData\Local\Programs\Python\Python37\lib\multiprocessing\context.py", line 322, in _Popen
        return Popen(process_obj)
      File "C:\Users\Mateusz\AppData\Local\Programs\Python\Python37\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
        reduction.dump(process_obj, to_child)
      File "C:\Users\Mateusz\AppData\Local\Programs\Python\Python37\lib\multiprocessing\reduction.py", line 60, in dump
        ForkingPickler(file, protocol).dump(obj)
    TypeError: can't pickle _thread.lock objects
    
    help wanted 
    opened by OnufryKlaczynski 48
  • [Error] select_for_update cannot be used outside of a transaction.

    [Error] select_for_update cannot be used outside of a transaction.

    This Django error (raised from SQL Compiler) pops up in my logs and prevent any scheduled tasks to run. The error is raised from this django_q line, which is very strange since the whole try block is within the transaction.atomic() context manager.

    Any idea on why this is happening and how to fix it? Thanks!

    Config:

    • db: Postgres 11 with psycopg2 interface
    • django-q 1.2.1
    • django 3.0
    • python 3.8

    Edit

    The error is reproduced in this basic demo app

    opened by edthrn 20
  • Import Error running qcluster command Python 3.7 Django 2.1.5

    Import Error running qcluster command Python 3.7 Django 2.1.5

    Traceback (most recent call last):
      File "manage.py", line 22, in <module>
        execute_from_command_line(sys.argv)
      File "ENV/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
        utility.execute()
      File "ENV/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "ENV/lib/python3.7/site-packages/django/core/management/__init__.py", line 224, in fetch_command
        klass = load_command_class(app_name, subcommand)
      File "ENV/lib/python3.7/site-packages/django/core/management/__init__.py", line 36, in load_command_class
        module = import_module('%s.management.commands.%s' % (app_name, name))
      File "ENV/versions/3.7.0/lib/python3.7/importlib/__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
      File "<frozen importlib._bootstrap>", line 983, in _find_and_load
      File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 728, in exec_module
      File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
      File "ENV/lib/python3.7/site-packages/django_q/management/commands/qcluster.py", line 4, in <module>
        from django_q.cluster import Cluster
      File "ENV/lib/python3.7/site-packages/django_q/cluster.py", line 24, in <module>
        from django_q import tasks
      File "ENV/lib/python3.7/site-packages/django_q/tasks.py", line 12, in <module>
        from django_q.cluster import worker, monitor
    ImportError: cannot import name 'worker' from 'django_q.cluster' (ENV/lib/python3.7/site-packages/django_q/cluster.py)
    Sentry is attempting to send 1 pending error messages
    Waiting up to 10 seconds
    Press Ctrl-C to quit
    
    opened by viperfx 17
  • Task stays in queue when executing a requests.post

    Task stays in queue when executing a requests.post

    When I try and execute a requests.post the task stays on the queue and never completes the requests.post request.

    Pseudo code:

    class Auth
      def __init__(self, url, username, password):
          logging.debug('Making call for credentials.')
          r = requests.post(url, data={'username': username, 'password': password})
    
    def queue_get_auth(username, password):
        a = Auth('https://auth', 'username', 'password')
    
    
    def validate_login(username, password):
        job = async(queue_get_auth, username, password)
    

    Error I am seeing and repeats until I delete it from the database queued tasks:

    [DEBUG] | 2015-10-19 14:46:05,510 | auth:  Making call for credentials.
    14:46:05 [Q] ERROR reincarnated worker Process-1:3 after death
    14:46:05 [Q] INFO Process-1:9 ready for work at 13576
    14:46:19 [Q] INFO Process-1:4 processing [mango-two-juliet-edward]
    

    Is there a reason why the requests.post would be causing it to fail? How would I debug this? If I run it in sync: True it works fine. This is running on a Mac OS X 10.11, database sqlite.

    Q_CLUSTER = {
        'name': 'auth',
        'workers': 4,
        'recycle': 500,
        'timeout': 60,
        'compress': False,
        'save_limit': 250,
        'queue_limit': 500,
        'sync': False,
        'cpu_affinity': 1,
        'label': 'Django Q',
        'orm': 'default'
    }
    
    opened by Xorso 16
  • scheduler creating duplicate tasks in multiple cluster environment

    scheduler creating duplicate tasks in multiple cluster environment

    We have a service that uses django-q for asynchronous tasks and it's deployed as 2 instances (2 AWS EC2 servers each running the same django project and each running a django-q cluster to process tasks). We've encountered an issue where the same scheduled task -- scheduled to run once -- gets picked up by each of the clusters in the scheduler (django-q.cluster) and ends up having 2 separate tasks being created.

    Example entries in our logs:

    On server 1:

    2017-04-02 20:25:56,747 - django-q - INFO - Process-1 created a task from schedule [14789]
    2017-04-02 20:25:56,842 - django-q - DEBUG - Pushed ('hamper-india-magnesium-pip', 'f1a1141c1835400ebc4f4b3894922b82')
    

    On server 2:

    2017-04-02 20:25:56,853 - django-q - INFO - Process-1 created a task from schedule [14789]
    2017-04-02 20:25:56,990 - django-q - DEBUG - Pushed ('alpha-william-kansas-apart', '5a4fcadb47674590933415dd5a71e1cc')
    

    Is this the expected behavior or is it a bug?

    What we are looking for is to have a scheduled task create only one async task to execute the action, even in a multi-cluster setup like ours.

    Can you comment on this behavior?

    We're using:

    Django (1.10.6)
    django-q (0.7.18)
    

    Thanks

    -Kevin

    opened by kefin 14
  • Worker recycle causes:

    Worker recycle causes: "ERROR connection already closed"

    Hello, and thanks for this great Django app! I'm using Python 3.4, Django 1.9.2, the latest django-q and the ORM broker backed by PostgreSQL.

    It appears that when my worker recycles, it loses the ability to talk to the database. Everything works fine up until that point. I've verified it is directly related to the recycle configuration parameter, and changing this changes the placement of the error accordingly.

    The output below shows the issue I'm having while running 1 single worker.

    14:43:16 [Q] INFO Processed [zulu-montana-triple-michigan] 14:43:16 [Q] INFO recycled worker Process-1:1 14:43:16 [Q] INFO Process-1:4 ready for work at 22360 14:43:16 [Q] INFO Process-1:4 processing [maryland-king-queen-table] 14:43:17 [Q] INFO Process-1:4 processing [summer-mirror-mountain-september] 14:43:17 [Q] INFO Processed [maryland-king-queen-table] 14:43:17 [Q] INFO Process-1:4 processing [illinois-finch-orange-sodium] 14:43:17 [Q] ERROR server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.

    Can you provide any guidance?

    Thanks

    opened by grayb 14
  • Limit number of retries

    Limit number of retries

    When a task fails (like an unhandled exception) it is thrown in the failing jobs list but also retried. It doesn't seem there's any limit to the number of retries, and that means a job which is doomed to failure (due to my bad programming) continues to fail all day. I get a message sent to Rollbar each time, and that adds up to a lot of messages and eats my quota.

    Is there a way to set a retry limit?

    opened by tremby 13
  • SSL errors after upgrading to qcluster version 1.1.0

    SSL errors after upgrading to qcluster version 1.1.0

    Hi,

    Is anyone else having SSL Errors when using the new version (1.1.0)? I tried upgrading it in production, but started to get "django.db.utils.OperationalError: SSL error: decryption failed or bad record mac" whenever django ORM's performs a query from within a django-q task (traceback below).

    Traceback (most recent call last):
      File "/usr/local/lib/python3.7/site-packages/django_q/cluster.py", line 379, in worker
        res = f(*task['args'], **task['kwargs'])
      File "/home/docker/src/tasks.py", line 8, in wake_up_driver_app
        for company in Company.objects.all():
      File "/usr/local/lib/python3.7/site-packages/django/db/models/query.py", line 274, in __iter__
        self._fetch_all()
      File "/usr/local/lib/python3.7/site-packages/django/db/models/query.py", line 1242, in _fetch_all
        self._result_cache = list(self._iterable_class(self))
      File "/usr/local/lib/python3.7/site-packages/django/db/models/query.py", line 55, in __iter__
        results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
      File "/usr/local/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1133, in execute_sql
        cursor.execute(sql, params)
      File "/usr/local/lib/python3.7/site-packages/sentry_sdk/integrations/django/__init__.py", line 446, in execute
        return real_execute(self, sql, params)
      File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 67, in execute
        return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
      File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
        return executor(sql, params, many, context)
      File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
        return self.cursor.execute(sql, params)
      File "/usr/local/lib/python3.7/site-packages/django/db/utils.py", line 89, in __exit__
        raise dj_exc_value.with_traceback(traceback) from exc_value
      File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
        return self.cursor.execute(sql, params)
    django.db.utils.OperationalError: SSL error: decryption failed or bad record mac
    

    Configuration:

    • broker: AWS SQS
    • database: AWS RDS Postgres 11.5
    • Django version: 2.2.10
    • Qcluster version: 1.1.0

    I found an old similar issue: https://github.com/Koed00/django-q/issues/79 but it seems to have been solved.

    Does anyone have a clue on how to investigate this issue? For now I'm keeping the previous version (1.0.2) that doesn't have those issues but I need some of the fixes that are part of 1.1.0 release.

    Thanks in advance!

    opened by marcelolima 12
  • Change schedule function to update or create new

    Change schedule function to update or create new

    By searching for the function we can update existing schedules.

    During development I noticed every time I changed a param from my scheduled function there was a entry inserted into the database. Giving me multiple scheduled functions from a single function.

    I havent updated any tests, if you want I can add a test for this 'new' feature

    opened by Eagllus 12
  • Add Sentry support

    Add Sentry support

    I see Rollbar is built in. Could you add support for Sentry too?

    Alternatively, you could pull out Rollbar into its own django-q-rollbar repo (and perhaps use extras so someone can add django-q[rollbar] to their requirements.txt), and expose a generic error handling interface so others can add their own.

    Really enjoying this project btw 😄

    opened by joeyespo 11
  • Django-q calls task twice or more

    Django-q calls task twice or more

    My background process is called twice (or more) but I'm really sure that should not be happening. My settings for Django Q:

    Q_CLUSTER = {
        'name': 'cc',
        'recyle': 10,
        'retry': -1,
        'workers': 2,
        'save_limit': 0,
        'orm': 'default'
    }
    

    My test task function:

    def task_test_function(email, user):
        print('test')
    

    calling it from the commandline:

    > python manage.py shell
    >>> from django_q.tasks import async
    >>> async('task_test_function', 'email', 'user')
    '9a0ba6b8bcd94dc1bc129e3d6857b5ee'
    

    Starting qcluster (after that I called the async)

    > python manage.py qcluster
    13:48:08 [Q] INFO Q Cluster-33552 starting.
    ...
    13:48:08 [Q] INFO Q Cluster-33552 running.
    13:48:34 [Q] INFO Process-1:2 processing [mobile-utah-august-indigo]
    test
    13:48:34 [Q] INFO Process-1:1 processing [mobile-utah-august-indigo]
    test
    13:48:34 [Q] INFO Processed [mobile-utah-august-indigo]
    13:48:34 [Q] INFO Processed [mobile-utah-august-indigo]
    ...
    

    And the function is called twice... For most functions I wouldn't really care if they run twice (or more) but I have a task that calls send_mail and people that are invited receive 2 or more mails...

    Is this a bug in Django Q or in my logic?

    opened by Eagllus 10
  • Why are failed tasks not being reattempted?

    Why are failed tasks not being reattempted?

    Hi, my failed tasks are not being reattempted.

    Here is my config:

    Q_CLUSTER = {
        "django_redis": "default",
        "save_limit": 10000,
        "timeout": 300,
        "retry": 300,
        "cpu_affinity": 3,
        "max_attempts": 3,
    }
    

    Here is an example: Screenshot 2023-01-03 at 15 13 20

    Screenshot 2023-01-03 at 15 16 50

    Here is the call for the above example: async_task(send_app_notif_latest_device_task, arg1, arg2)

    Thanks!

    opened by astrike30 0
  • Cannot re-initialize CUDA in forked subprocess

    Cannot re-initialize CUDA in forked subprocess

    I get the following error when a qcluster worker attempts to use CUDA:

    Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method

    How I can get around this error?

    opened by mkzia 1
  • Which Queued Tasks are currently running?

    Which Queued Tasks are currently running?

    I have django-q set up to run several different background processes -- these processes take anywhere from 10 min to several hours to run.

    I want the user to have visibility on which task is currently running, and which tasks are still 'waiting' to be run. Retrieving the queued tasks is straight forward with the ormq object -- but there is no indicator for which of those tasks are currently running.

    I thought, that I could just 'assume' that the lowest pk(s) identifiers would always be the ones running - but that does not seem to be the case.

    Any thoughts?

    @Koed00

    opened by tylerautera 0
  • Why I am getting 'ERROR reincarnated worker...' without any error specifics?

    Why I am getting 'ERROR reincarnated worker...' without any error specifics?

    I have a function that works fine manually, but in DjangoQ it returns ERROR reincarnated worker Process-1:534 after death over and over again without giving me any specifics of what the error was?

    So my question is, in what case will DjangoQ just destory the worker and not specify what error caused it?

    More context, I run Django-Q in an AWS EC2, and my only suspicion is that my EC2 runs out of memory or resources during this task, and DjangoQ has no chance to explain what the error was.

    Can anyone confirm? is running out of memory a reason DjangoQ will just quit like above without showing any exceptions?

    opened by igalci 0
  • Inconsistent Schedule deletion depending if schedule type is Schedule.ONCE or not

    Inconsistent Schedule deletion depending if schedule type is Schedule.ONCE or not

    A Schedule instance is only deleted after the task is queued if its scheduled type is Schedule.ONCE and repeats == -1, which is non intuitive to the user.

    • the online documentation says that the task will be queued indefinitely if repeats == -1 (I assume that's "always" means), but that's not true for tasks with schedule type Schedule.ONCE. Why do we even need a Schedule.ONCE schedule type if the user can create a Schedule instance with repeats=1 ? Having both Schedule.ONCE as a schedule type and the repeats argument set to a value different that 1 in the same task doesn't make sense.
    • Schedule instances should be consistently deleted when the task is queued, regardless of schedule type. If the library wants to parameterize the Schedule deletion, it could be done consistently with an argument like delete_after_queued.
    opened by alanoe 0
  • Bump certifi from 2021.5.30 to 2022.12.7

    Bump certifi from 2021.5.30 to 2022.12.7

    Bumps certifi from 2021.5.30 to 2022.12.7.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
Releases(v1.3.9)
  • v1.3.9(Jun 10, 2021)

  • v1.3.8(Jun 8, 2021)

  • v1.3.7(Jun 3, 2021)

    Changes

    • Build improvements and localtime fixes(#569) @Koed00
    • Create codeql-analysis.yml (#564) @Koed00
    • Fix docs error (#563) @aken830806
    • Codecov_fixes. Got coverage again (#562) @Koed00
    • Feature/improves multiple databases support (#561) @abxsantos

    This release will try to fully switch to Poetry for building releases. Please create an issue if there are any problems.

    Source code(tar.gz)
    Source code(zip)
  • v1.3.6(May 14, 2021)

    Changes

    • Fix for SSL errors in #422 (#556) @nittolese
    • Fixes #314 - Convert func to its import path str so that resubmitting failed task works (#554) @kennyhei
    • Add "qmemory" command (#553) @kennyhei
    • Allow tasks to be scheduled on a specific cluster (#555) @midse
    • Fixes #225 - Successful tasks grow beyond SAVE_LIMIT (#552) @kennyhei
    • Update documentation for new retry time default (#538) @amo13
    • Fixes deprecated count method (#549) @Koed00
    • Updates testing to python 3.9 and Django 3.2 (#548) @Koed00
    • Adds long polling support (#506) @Javedgouri
    • Use 'timezone.localtime()' when calculating the next run time (#520) @wy-z
    Source code(tar.gz)
    Source code(zip)
  • v1.3.5(Feb 26, 2021)

    Changes

    • Add a warning for misconfiguration. (#509) @icfly2
    • Migrate to Github Action CI (#507) @Koed00
    • Add broker name in Schedule and enhanced Queued Tasks list display admin (#502) @telmobarros
    • Add example of http health check (#504) @pysean3
    • Added german translation (#499) @jonaswinkler
    • Update brokers.rst (#497) @MaximilianKindshofer
    Source code(tar.gz)
    Source code(zip)
  • v1.3.4(Oct 29, 2020)

    Changes

    • Try to get SQS queue before creating it (#478) @fallenhitokiri
    • Empty dictionary as configuration value for SQS (#477) @fallenhitokiri
    • Model.unicode() has no effect in Python 3.X (#479) @alx-sdv
    • Fix deprecation warning RemovedInDjango40Warning (#483) @Djailla
    • Fix for #424 TypeError: can't pickle _thread.lock objects (#482) @ihuk
    • [WIP]Change Django documentation links and URLs to a supported version (v1.8 -> v2.2) (#481) @jagu2012
    Source code(tar.gz)
    Source code(zip)
  • v1.3.3(Aug 16, 2020)

    Changes

    • Add attempt_count to limit the number of times a filed task will be re-attempted (#466) @timomeara
    • Updates to Django 3.1 (#464) @Koed00
    Source code(tar.gz)
    Source code(zip)
  • v1.3.2(Jul 8, 2020)

  • v1.3.1(Jul 2, 2020)

  • v1.3.0(Jul 2, 2020)

    Changes

    • Support for Cron expressions (#452) @Koed00
    • Adds hint, some linting and a release drafter (#449) @Koed00
    • Use 'force_str' instead of deprecated 'force_text' (#448) @edouardtheron
    • [cleanup] Few cleanup commit for linting and migrations (#447) @Djailla

    Dependency Updates

    • Updates packages (#450) @Koed00

    Notes

    • This release includes migrations
    • For cron expression support you will have to pip install croniter.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.4(Jun 10, 2020)

  • v1.2.3(May 31, 2020)

  • v1.2.2(May 31, 2020)

    Closed issues:

    • Scheduled task being executed many times #426
    • schedule doesn't work #416
    • Expose list of workers and their states via API #364
    • Tasks are not encrypted, only signed #300

    Merged pull requests:

    • Poetry #442 (Koed00)
    • Fix issues when using multiple databases with a database router #440 (maerteijn)
    • Update documentation to say tasks are signed, not encrypted #429 (asedeno)
    • Fix issue when using USE_TZ=False with MySQL #428 (hhyo)
    • When sync=True, re-raise exceptions from the worker. #417 (rbranche)
    Source code(tar.gz)
    Source code(zip)
  • v1.2.1(Feb 18, 2020)

  • v1.2.0(Feb 17, 2020)

  • v.1.1.0(Jan 18, 2020)

  • v1.0.2(Aug 10, 2019)

    • Fixes deprecated Arrow interface issues.
    • Tests with Django 2.2.4 and 1.11.23
    • SQL server fix @wgordon17
    • Circular import fix @lamby
    • MySQL fix for no timezone configs @maerteijn
    • Loads of timeout and concurrency fixes from @jannero
    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Aug 29, 2018)

    • Added French locale @tboulogne
    • Removes Python 3.4 from supported versions

    Unfortunately the re-factoring for Python 3.7 has caused some circular imports in Python 3.4 I've removed support for now but I'm open to PR's to fix this for those that are stuck with 3.4 until EOL.

    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Aug 14, 2018)

    Breaking Changes!

    • Supports Python 3.7 > async became a reserved keyword, replaced by async_task @P-EB
    • Deprecated Python 2
    • Supports Django 2+
    • Deprecated Django < 1.11
    • Deprecated Rollbar as a separate module > use the pluggeable error reporters from now on
    • Adds exception traceback to failed tasks @strets123
    • Frees resources when running in sync mode @abompard

    This release no longer supports older Python and Django versions. For those that want to keep using Django-Q with Python 2.7, please use release v0.9.4.

    Please replace all occurrences of async with async_task when you upgrade.

    Source code(tar.gz)
    Source code(zip)
  • v0.9.4(Mar 13, 2018)

  • v0.9.3(Mar 13, 2018)

    • Adds option for acknowledging failed tasks @Balletie
    • Changes some imports to prevent namespace clashes @Eagllus
    • Updated to the latest Django versions ( 1.8.19, 1.11.11, 2.0.3) and packages for testing
    Source code(tar.gz)
    Source code(zip)
  • v0.9.2(Feb 13, 2018)

    • fixes some Python 2 regressions - @Eagllus

    Please note that we will gradually remove support for Python 2 in 2018. We will keep a stable compatible package around for those that need it.

    Source code(tar.gz)
    Source code(zip)
  • v0.9.1(Feb 2, 2018)

    • fixes admin url escaping for Django 2 - @Eagllus
    • fixes error reporter plugin entry points - @danielwelch
    • allows SQS to use generic AWS environment variables - @svdgraaf
    • updates some packages for testing
    Source code(tar.gz)
    Source code(zip)
  • v0.9.0(Jan 8, 2018)

  • v0.8.1(Oct 12, 2017)

    • Introduces pluggable error reporters and Sentry support. Thanks to @danielwelch
    • Removes the future dependency. Thanks to @benjaoming
    • Uses 32 bit integer for repeat field. Thanks to @gchardon-hiventy
    • Replaces some relative imports for better compatibility
    • Updates supported Django to 1.11.6
    • Tested with latest Python 2.7 and 3.6 versions
    • Updated package dependencies
    Source code(tar.gz)
    Source code(zip)
  • v0.8.0(Apr 5, 2017)

  • v0.7.18(Jun 7, 2016)

  • v0.7.17(Apr 24, 2016)

  • v0.7.16(Mar 7, 2016)

    • Updates compatibility to Django 1.8.11 and 1.9.4
    • Clears database connections on worker death
    • Group names for schedules now actually work
    • Schedule names in the admin can be left blank
    • Task names can now be set with the task_name argument
    Source code(tar.gz)
    Source code(zip)
  • v0.7.15(Jan 27, 2016)

    • You can now use your own custom broker classes by setting broker_class https://django-q.readthedocs.org/en/latest/brokers.html#custom-broker
    • The polling interval for database based brokers can now be set with poll https://django-q.readthedocs.org/en/latest/configure.html#poll
    • Fixes an issue with the Rollbar config
    Source code(tar.gz)
    Source code(zip)
A Django application that provides country choices for use with forms, flag icons static files, and a country field for models.

Django Countries A Django application that provides country choices for use with forms, flag icons static files, and a country field for models. Insta

Chris Beaven 1.2k Dec 31, 2022
Flashback is an awesome, retro IRC based app built using Django

Flashback Flashback is an awesome, retro IRC based app built using Django (and the Django Rest Framework) for the backend as well as React for the fro

Unloading Gnat 1 Dec 22, 2021
Django web apps for managing schedules.

skdue Description Skdue is a web application that makes your life easier by helping you manage your schedule. With the ability which allows you to cre

Patkamon_Awai 1 Jun 30, 2022
🗂️ 🔍 Geospatial Data Management and Search API - Django Apps

Geospatial Data API in Django Resonant GeoData (RGD) is a series of Django applications well suited for cataloging and searching annotated geospatial

Resonant GeoData 53 Nov 01, 2022
Helps working with singletons - things like global settings that you want to edit from the admin site.

Django Solo +---------------------------+ | | | | | \ | Django Solo helps

Sylvain Toé 726 Jan 08, 2023
Book search Django web project that uses requests python library and openlibrary API.

Book Search API Developer: Vladimir Vojtenko Book search Django web project that uses requests python library and openlibrary API. #requests #openlibr

1 Dec 08, 2021
Displaying objects on maps in the Django views and administration site.

DjangoAdminGeomap library The free, open-source DjangoAdminGeomap library is designed to display objects on the map in the Django views and admin site

Vitaly Bogomolov 31 Dec 28, 2022
Realworld - Realworld using Django and HTMX

Realworld - Realworld using Django and HTMX

Dan Jacob 53 Jan 05, 2023
A clone of https://virgool.io written in django

Virgool clone A clone of virgool blog written in django Installation first rename the .env.sample to .env and fill it. with docker docker-compose up -

Danial Selmipoor 7 Dec 23, 2022
Django CRUD REST API Generator

Django CRUD REST API Generator This is a simple tool that generates a Django REST API with the given models. Specs: Authentication, DRF generic views,

Mehmet Alp Sümer 57 Nov 24, 2022
Website desenvolvido em Django para gerenciamento e upload de arquivos (.pdf).

Website para Gerenciamento de Arquivos Features Esta é uma aplicação full stack web construída para desenvolver habilidades com o framework Django. O

Alinne Grazielle 8 Sep 22, 2022
this is a simple backend for instagram with python and django

simple_instagram_backend this is a simple backend for instagram with python and django it has simple realations and api in 4 diffrent apps: 1-users: a

2 Oct 20, 2021
Agenda feita usando o django para adicionar eventos

Agenda de Eventos Projeto Agenda com Django Inicio O projeto foi iniciado no Django, usando o models.py foi adicionado os dados dos eventos e feita as

Bruno Fernandes 1 Apr 14, 2022
Python port of Google's libphonenumber

phonenumbers Python Library This is a Python port of Google's libphonenumber library It supports Python 2.5-2.7 and Python 3.x (in the same codebase,

David Drysdale 3.1k Jan 08, 2023
Django backend of Helium's planner application

Helium Platform Project Prerequisites Python (= 3.6) Pip (= 9.0) MySQL (= 5.7) Redis (= 3.2) Getting Started The Platform is developed using Pytho

Helium Edu 17 Dec 14, 2022
Django GUID attaches a unique correlation ID/request ID to all your log outputs for every request.

Django GUID Now with ASGI support! Django GUID attaches a unique correlation ID/request ID to all your log outputs for every request. In other words,

snok 300 Dec 29, 2022
A package to handle images in django

Django Image Tools Django Image Tools is a small app that will allow you to manage your project's images without worrying much about image sizes, how

The Bonsai Studio 42 Jun 02, 2022
Exemplo de biblioteca com Django

Bookstore Exemplo de biblioteca feito com Django. Este projeto foi feito com: Python 3.9.7 Django 3.2.8 Django Rest Framework 3.12.4 Bootstrap 4.0 Vue

Regis Santos 1 Oct 28, 2021
Analytics services for Django projects

django-analytical The django-analytical application integrates analytics services into a Django project. Using an analytics service with a Django proj

Jazzband 1.1k Dec 31, 2022
Simple web site for sharing your short stories and beautiful pictures

Story Contest Simple web site for sharing your short stories and beautiful pictures.(Cloud computing first assignment) Clouds The table below shows cl

Alireza Akhoundi 5 Jan 04, 2023