{"id":16174966,"url":"https://github.com/app-generator/sample-django-celery2","last_synced_at":"2025-07-20T11:33:25.085Z","repository":{"id":40662272,"uuid":"485889443","full_name":"app-generator/sample-django-celery2","owner":"app-generator","description":null,"archived":false,"fork":false,"pushed_at":"2022-05-04T05:14:47.000Z","size":296,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-07-20T05:57:46.506Z","etag":null,"topics":["appseed-sample","django-sample"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/app-generator.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-04-26T17:43:45.000Z","updated_at":"2022-09-24T06:43:49.000Z","dependencies_parsed_at":"2022-07-24T19:46:42.993Z","dependency_job_id":null,"html_url":"https://github.com/app-generator/sample-django-celery2","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/app-generator/sample-django-celery2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/app-generator%2Fsample-django-celery2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/app-generator%2Fsample-django-celery2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/app-generator%2Fsample-django-celery2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/app-generator%2Fsample-django-celery2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/app-generator","download_url":"https://codeload.github.com/app-generator/sample-django-celery2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/app-generator%2Fsample-django-celery2/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266117836,"owners_count":23879123,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["appseed-sample","django-sample"],"created_at":"2024-10-10T04:43:52.105Z","updated_at":"2025-07-20T11:33:25.060Z","avatar_url":"https://github.com/app-generator.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":" # [Sample Django With Celery](https://github.com/app-generator/sample-django-celery)\n\n\u003e Features:\n\n-  Landing page display all tasks (active and finished + input provided by the user)\n- Users can submit tasks using a String Input\n- Tasks will start using the input, log the string, and exit\n- SQLite persistence where all tasks are saved (id, execution status, input)\n- Styling: Bootstrap 5\n- Landing page elements will use BS5 default components\n\n\u003cbr /\u003e\n\n\u003e How to use it\n\n\n1. Download Redis\n\n   redis server \n   \n   ***Linux*** [https://redis.io/download]\n                            \n   ***Windows*** [https://github.com/tporadowski/redis/releases]\n\n2. Clone repository \u0026 Test Redis:\n\n    open Terminal\n\n- Clone repository\n\t \n````\n$ git clone https://github.com/app-generator/sample-django-celery.git\n\n````\n- Test redis\n\n```` \n    redis-cli ping\n\n    $ redis-cli ping\n    PONG\n````\n    Close Redis with control + c to quit\n\n\u003e **Install Modules** using a Virtual Environment\n\n```\n$ virtualenv env\n$ source env/bin/activate\n$ pip3 install -r requirements.txt\n```\n\nOr for **Windows-based Systems**\n\n```\n$ virtualenv env\n$ .\\env\\Scripts\\activate\n$\n$ # Install modules - SQLite Database\n$ pip3 install -r requirements.txt\n```\n\n\u003cbr /\u003e\n\n\u003e  **Migrate Database**\n\n```\n$ python manage.py migrate\n$ python manage.py runserver\n```\n\n\u003cbr /\u003e\n\n\u003e  **Create Superuser**\n\n```\n$ python manage.py createsuperuser\n```\n\n\u003cbr /\u003e\n\n\u003e  **Start the APP**\n\t\nLocally After All:\n\nStart Redis server\n````\nStart celery: celery -A basic.celery worker -l info\n````\n\n```\n$ python manage.py runserver\n```\n\nvisit on browser to load site\n```\nhttp://127.0.0.1:8000\n```\n\u003cbr /\u003e\n\n\u003e Developers Notes\n\n1. Install Celery + Redis in your virtualenv.\n\npip install celery\n\npip install redis\n\npip install django-celery-beat\n\npip install django-celery-results\n\n\n2. Update Django settings.py:\n\n````\nINSTALLED_APPS = [\n    \n\t'django.contrib.admin',\n\n    'django.contrib.auth',\n\t\n    'django.contrib.contenttypes',\n\t\n    'django.contrib.sessions',\n\t\n    'django.contrib.messages',\n\t\n    'django.contrib.staticfiles',\n\t\n    'rest_framework',\n\t\n    'rest_framework.authtoken',\n\t\n    'corsheaders',\n\t\n    'django_celery_results',\n\t\n    'django_celery_beat',\n\t\n    'account',   # Custom user account and profile app\n\t\n\t'django_celery_tracker',  # Our main app for the task creation\n]\n````\n\n#Update CELERY_SETTINGS\n````\nCELERY_BROKER_URL = 'redis://localhost:6379'\n\nCELERY_RESULT_BACKEND = 'redis://localhost:6379'\n\nCELERY_ACCEPT_CONTENT = ['application/json']\n\nCELERY_TASK_SERIALIZER = 'json'\n\nCELERY_RESULT_SERIALIZER = 'json'\n\nCELERY_TIMEZONE = TIME_ZONE\n````\n\n3. Create celery.py to setup Celery app: Navigate to project config module (where settings and urls modules are) and create a celery.py file with the contents:\n\n````python\nfrom __future__ import absolute_import, unicode_literals\nimport os\n\nfrom celery import Celery\nfrom celery.schedules import crontab\n\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'basic.settings')\napp = Celery('basic')\napp.config_from_object('django.conf.settings', namespace='CELERY')\n\napp.conf.beat_schedule = {\n    'remove-expired-OTPTokens' : {\n        'task': 'account.tasks.remove_expired_OTPTokens',\n        'schedule': crontab(hour=15, minute=42),\n        'args': ('Scheduled task done...',),\n    },\n}\n\napp.autodiscover_tasks()\n````\n\n4. Create tasks.py in your Django main app (\"django_celery_tracker\") :\n\n````python\nfrom __future__ import absolute_import, unicode_literals\n\nfrom celery import shared_task\nfrom celery.utils.log import get_task_logger\n\nlogger = get_task_logger(__name__)\n\n\n@shared_task(bind=True)\ndef text_task(self, text):\n    try:\n        logger.info(\"About to print text\")\n        print(text)\n    except BadHeaderError:\n        logger.info(\"BadHeaderError\")\n    except Exception as e:\n        logger.error(e)\n````\n\n5. Create views.py to invoke task when text is submited from form.\n````python\nclass TextFormView(FormView):\n    form_class = TextFormModelForm\n    template_name = \"celery_tracker/timeline_dashboard.html\"\n    success_url = \"/\"\n    def get_context_data(self, **kwargs):\n        ctx = super().get_context_data(**kwargs)\n        ctx['celery_track'] = CeleryTask.objects.all()\n        return ctx\n    def form_valid(self, form):\n        form.save()\n        self.process_text(form.cleaned_data)\n\n        return super().form_valid(form)\n\n    def process_text(self, valid_data):\n        text = valid_data[\"text\"]\n\n        text_task.delay(\n            text\n        )\n````\n\nWe use .delay() to tell Celery to add the task to the queue.\n\nWe got back a successful AsyncResult — that task is now waiting in Redis for a worker to pick it up!\ntext_task.delay() (should see `\u003cAsyncResult: c6ef74b9-4c03-402a-b1db-9e2adbf52f75\u003e`)\n\n6. Create django_celery_tracker/signals.py.  We use celery signals to log tasks status and activities. \n````python\nfrom celery.signals import before_task_publish, task_prerun, task_postrun\n\n\n@before_task_publish.connect\ndef task_publish_handler(sender=None, headers=None, body=None, **kwargs):\n    from django_celery_tracker.models import CeleryTask\n    info = headers if 'task' in headers else body\n    print(info)\n    CeleryTask.objects.get_or_create(\n        task_id=info['id'], task_name=info['task'], args=info['argsrepr']\n    )\n\n\n@task_prerun.connect\ndef task_prerun_handler(sender=None, task_id=None, **kwargs):\n    from django_celery_tracker.models import CeleryTask\n    from django.utils import timezone\n\n    t = CeleryTask.objects.get_or_create(task_id=task_id)[0]\n    t.started = timezone.now()\n    t.save(update_fields=['started'])\n\n\n@task_postrun.connect\ndef task_postrun_handler(sender=None, task_id=None, state=None, **kwargs):\n    from django_celery_tracker.models import CeleryTask\n    from django.utils import timezone\n\n    t = CeleryTask.objects.get_or_create(task_id=task_id)[0]\n    t.completed = timezone.now()\n    if state is not None:\n        t.post_state = state\n    else:\n        t.post_state = 'PREMATURE_SHUTDOWN'\n    t.save(update_fields=['completed', 'post_state'])\n````\n\n7. In models.py, give the following\n\n````python\t\t\nclass CeleryTask(models.Model):\n    task_id = models.CharField(max_length=64, db_index=True, unique=True)\n    task_name = models.CharField(max_length=512)\n    args = models.TextField(blank=True, null=True)\n    created = models.DateTimeField(auto_now_add=True, null=True)\n    started = models.DateTimeField(null=True, blank=True)\n    completed = models.DateTimeField(null=True, blank=True)\n    post_state = models.CharField(max_length=24, blank=True)\n    progress = models.PositiveIntegerField(default=0)\n    progress_target = models.PositiveIntegerField(default=100)\n\n    def __str__(self):\n        return \"id=%s, name=%s\" % (self.task_id, self.task_name)\n````\n\n8. \n###################### DEPLOY ON HEROKU #####################\n1) .gitignore (get rid of local environ but create requirements.txt instead)\n2) same level as manage.py CREATE Procfile:\nIn Procfile:\n````\nweb: gunicorn basic.wsgi --log-file -\nworker_and_beat: REMAP_SIGTERM=SIGQUIT celery -A basic.celery worker --loglevel=info -B\n````\n3) pip install django psycopg2 dj-database-url gunicorn\n4) git init\n5) git add .\n6) git commit -m \"First Init\"\n7) heroku create\n\n8.1) Add postgresql database addon\n````\nheroku addons:create heroku-postgresql:hobby-dev\n````\n8.2) install redis addon\n````\nheroku addons:create heroku-redis:hobby-dev\n````\n9) in settings.py under database: (will override the settings to use postgresql database if \"DATABASE_URL\" database environment available.) \n````python\nif 'DATABASE_URL' in os.environ:\n\n    DATABASES = {\n        'default': dj_database_url.parse(os.environ.get('DATABASE_URL'))\n    }\n\nelse:\n\n    DATABASES = {\n        'default': {\n            'ENGINE': 'django.db.backends.sqlite3',\n            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),\n        }\n    }\n````\n10) git add .\n\n11) git commit -m \"change database\"\n\n12) heroku config:set DISABLE_COLLECTSTATIC=1\n\n13.1) git push heroku master\n\n13.2) After pushing: SCALE:\n\n~ heroku ps:scale web=1 worker=1\n\nOR if using schedule\n\n~ heroku ps:scale web=1 worker=1 beat=1 (must be paid plan)\n\n14) heroku run python manage.py migrate\n15) heroku run bash\n16) python manage.py createsuperuser\n17) heroku open\n\n\nheroku restart\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapp-generator%2Fsample-django-celery2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fapp-generator%2Fsample-django-celery2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapp-generator%2Fsample-django-celery2/lists"}