paulonteri/django-serverless-cron

django-serverless-cron 🦡 A Django app with a simpler approach running cron jobs (mostly in a serverless environment) through HTTP requests with an integration with the Django admin. This allows you to run any task without having to manage always-on infrastructure. https://pypi.org/project/django-serverless-cron

async
cron
cronjob
django
python
serverless

django-serverless-cron 🦡

image

image

image

image

django-serverless-cron is a Django app with a simpler approach running cron jobs. This is done through exposing a HTTP endpoint to invoke the jobs that allows you to run any task without having to manage always-on infrastructure.

There is also an option to run jobs via management commands and the Django admin.

Why?

This is essentially a replacement/supplement for a traditional OS \'cron\' or \'job scheduler\' system:

  • Serverless cron jobs no-longer a pain. Note that if you have alternatives like django-crontab or celery working well for you, good for you! You probably don\'t need this. However, it\'s okay to be curious.
  • Schedule jobs to run at a frequency that is less than 1 min. (crontab is limited to 1 min)
  • The machine running crontab is no longer a single point of failure.
  • The problem with the above systems is that they are often configured at the operating system level, which means their configuration is probably not easily \'portable\' and \'debug-able\' (if you are developing on Windows, the scheduler works differently from Linux or Unix). Also can not easily be integrated into a development environment.
  • Manually triggered cron jobs. Eg: via the Django Admin.
  • Alternative to cron services that aren\'t always available on free (and sometimes paid) web hosting services.
  • Easier access to cron job execution logs and monitoring execution failures.
  • No need to learn crontab. Think of it as a friendlier alternative to traditional cron jobs. Simple cron job creation. No need for cron syntax, no guessing on job frequency. Easy controls.
  • Designed around services like [Google Cloud Scheduler]{.title-ref} and [Amazon EventBridge]{.title-ref}.

Documentation

Documentation is graciously hosted at https://django-serverless-cron.readthedocs.io.

Contributions

Feel free to make pull requests and submit issues/requests. Find more detailed instructions under the [contributing]{.title-ref} section.

Alternatively, you can leave a star on the repo to show your support. 🙂

Quickstart

Installation

Install Django Serverless Cron:

pip install django-serverless-cron

Settings

Add it to your `INSTALLED_APPS`:

INSTALLED_APPS = (
    # ...
    'django_serverless_cron'
    # ...
)

Add jobs to your settings file:

SERVERLESS_CRONJOBS = [
    # (
    #   '1_hours',                       # frequency (seconds, minutes, hours, days, weeks) -> in this case, every one hour
    #   'mail.jobs.send_mail_function',  # path to task/function functions -> in this case, send_mail_function()
    #   {'kwarg1': 'foo'}                # kwargs passed to the function
    # ),
    (
        '1_days',
        'your_app.services.your_job_function',
        {'kwarg1': 'foo', 'kwarg2': 'bar', "is_bulk": True}
    ),
    (
        '1_hours',
        'mail.jobs.send_mail_function',
        {}                               # job without kwargs
    ),
]

URL patterns

Add the jobs to your URL patterns:

from django.urls import path, re_path, include #add re_path and include
from django_serverless_cron import urls as django_serverless_cron_urls


urlpatterns = [
    # ...
    re_path(r'^', include(django_serverless_cron_urls)),
    #...
]

Migrate

python manage.py migrate

Running Jobs

In Development

Running Jobs through HTTP requests

Call the [/run]{.title-ref} path to run all jobs:

Example:

curl http://localhost:8000/run

or

import requests

x = requests.get('http://localhost:8000/run')

Running Jobs through the management command

This will run the jobs every 30 seconds:

python manage.py serverless_cron_run

You can alternatively add the [--single_run=\'True\']{.title-ref} option to run the jobs just once.

In Production

Similar to in development, we can call the [/run]{.title-ref} path via fully managed services which are usually ridiculously cheap. Examples:

Related media

For more learning check out:

Credits

Tools used in rendering this package:

Stars
30
100.00% more than last month
Forks
6
Open Issues
0