From eadd3e77f83460e0531d709444cbc110315886dc Mon Sep 17 00:00:00 2001 From: Jay Date: Sun, 12 Oct 2014 10:32:17 +0200 Subject: [PATCH 1/3] added optional celery support out of the box --- CONTRIBUTORS.txt | 1 + README.rst | 2 ++ cookiecutter.json | 1 + {{cookiecutter.repo_name}}/README.rst | 15 +++++++++++ .../config/settings/common.py | 8 ++++++ .../config/settings/local.py | 7 +++++ .../requirements/base.txt | 4 +++ .../{{cookiecutter.repo_name}}/__init__.py | 4 +++ .../{{cookiecutter.repo_name}}/celery.py | 26 +++++++++++++++++++ 9 files changed, 68 insertions(+) create mode 100644 {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 9bbbfd4b..dc35a60c 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -47,6 +47,7 @@ Harry Percival / @hjwp Cullen Rhodes / @c-rhodes Audrey Roy Greenfeld / @audreyr (and creator/maintainer of cookiecutter) * Burhan Khalid / @burhan +Jannis Gebauer / @got_nil * Possesses commit rights diff --git a/README.rst b/README.rst index fd6c3eb0..d74c9f59 100644 --- a/README.rst +++ b/README.rst @@ -27,6 +27,7 @@ Features * Basic e-mail configurations for send emails via Mailgun_ * Media storage using Amazon S3 * Serve static files from Amazon S3 or Whitenoise_ (optional) +* Pre configured Celery_ (optional) .. _Bootstrap: https://github.com/twbs/bootstrap .. _AngularJS: https://github.com/angular/angular.js @@ -37,6 +38,7 @@ Features .. _Procfile: https://devcenter.heroku.com/articles/procfile .. _Mailgun: https://mailgun.com/ .. _Whitenoise: https://whitenoise.readthedocs.org/ +.. _Celery: http://www.celeryproject.org/ Constraints diff --git a/cookiecutter.json b/cookiecutter.json index 25233dbb..b61ca307 100644 --- a/cookiecutter.json +++ b/cookiecutter.json @@ -10,5 +10,6 @@ "now": "2015/01/13", "year": "{{ cookiecutter.now[:4] }}", "use_whitenoise": "y", + "use_celery": "n", "windows": "n" } diff --git a/{{cookiecutter.repo_name}}/README.rst b/{{cookiecutter.repo_name}}/README.rst index 9c0859bc..bc3b1c50 100644 --- a/{{cookiecutter.repo_name}}/README.rst +++ b/{{cookiecutter.repo_name}}/README.rst @@ -108,6 +108,21 @@ To get live reloading to work you'll probably need to install an `appropriate br .. _appropriate browser extension: http://feedback.livereload.com/knowledgebase/articles/86242-how-do-i-install-and-use-the-browser-extensions- +{% if cookiecutter.use_celery == "y" %} +Celery +^^^^^^ +This app comes with Celery. + +To run a celery worker: + +.. code-block:: bash + + cd {{cookiecutter.repo_name}} + celery -A {{cookiecutter.repo_name}} worker -l info + +Please note: For Celerys import magic to work, it is important *where* the celery commands are run. If you are in the same folder with *manage.py*, you should be right. +{% endif %} + It's time to write the code!!! diff --git a/{{cookiecutter.repo_name}}/config/settings/common.py b/{{cookiecutter.repo_name}}/config/settings/common.py index 957d3110..a3c9b38d 100644 --- a/{{cookiecutter.repo_name}}/config/settings/common.py +++ b/{{cookiecutter.repo_name}}/config/settings/common.py @@ -256,4 +256,12 @@ LOGGING = { } } +{% if cookiecutter.use_celery == "y" %} +########## CELERY +# if you are not using the django database broker (e.g. rabbitmq, redis, memcached), you can remove the next line. +INSTALLED_APPS += ('kombu.transport.django',) +BROKER_URL = env("CELERY_BROKER_URL", default='django://') +########## END CELERY +{% endif %} + # Your common stuff: Below this line define 3rd party library settings diff --git a/{{cookiecutter.repo_name}}/config/settings/local.py b/{{cookiecutter.repo_name}}/config/settings/local.py index 8126310b..050ac23b 100644 --- a/{{cookiecutter.repo_name}}/config/settings/local.py +++ b/{{cookiecutter.repo_name}}/config/settings/local.py @@ -59,4 +59,11 @@ INSTALLED_APPS += ('django_extensions', ) # ------------------------------------------------------------------------------ TEST_RUNNER = 'django.test.runner.DiscoverRunner' +{% if cookiecutter.celery_support == "y" %} +########## CELERY +# In development, all tasks will be executed locally by blocking until the task returns +CELERY_ALWAYS_EAGER = True +########## END CELERY +{% endif %} + # Your local stuff: Below this line define 3rd party library settings diff --git a/{{cookiecutter.repo_name}}/requirements/base.txt b/{{cookiecutter.repo_name}}/requirements/base.txt index d9dc0c35..a9c6f39e 100644 --- a/{{cookiecutter.repo_name}}/requirements/base.txt +++ b/{{cookiecutter.repo_name}}/requirements/base.txt @@ -34,4 +34,8 @@ django-autoslug==1.8.0 # Time zones support pytz==2015.4 +{% if cookiecutter.use_celery == "y" %} +celery==3.1.18 +{% endif %} + # Your custom requirements go here diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py index ebc6a5e1..c51fe1a1 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py @@ -1,3 +1,7 @@ # -*- coding: utf-8 -*- +{% if cookiecutter.use_celery == "y" %} +from __future__ import absolute_import +from {{cookiecutter.repo_name}}.celery import app as celery_app +{% endif %} __version__ = '{{ cookiecutter.version }}' __version_info__ = tuple([int(num) if num.isdigit() else num for num in __version__.replace('-', '.', 1).split('.')]) diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py new file mode 100644 index 00000000..6bdbff2e --- /dev/null +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py @@ -0,0 +1,26 @@ +{% if cookiecutter.use_celery == "y" %} +from __future__ import absolute_import + +import os + +from celery import Celery + +# set the default Django settings module for the 'celery' program. +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local") + +from django.conf import settings + +app = Celery('{{cookiecutter.repo_name}}') + +# Using a string here means the worker will not have to +# pickle the object when using Windows. +app.config_from_object('django.conf:settings') +app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) + + +@app.task(bind=True) +def debug_task(self): + print('Request: {0!r}'.format(self.request)) +{% else %} +# use this as a starting point for your project with celery. +{% endif %} \ No newline at end of file From 073666e09ccf214f178a99f0326dfdc96aea716e Mon Sep 17 00:00:00 2001 From: Jay Date: Sun, 12 Oct 2014 10:32:17 +0200 Subject: [PATCH 2/3] now passes flake8 --- {{cookiecutter.repo_name}}/config/settings/common.py | 2 -- {{cookiecutter.repo_name}}/config/settings/local.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/{{cookiecutter.repo_name}}/config/settings/common.py b/{{cookiecutter.repo_name}}/config/settings/common.py index a3c9b38d..324a8efd 100644 --- a/{{cookiecutter.repo_name}}/config/settings/common.py +++ b/{{cookiecutter.repo_name}}/config/settings/common.py @@ -255,7 +255,6 @@ LOGGING = { }, } } - {% if cookiecutter.use_celery == "y" %} ########## CELERY # if you are not using the django database broker (e.g. rabbitmq, redis, memcached), you can remove the next line. @@ -263,5 +262,4 @@ INSTALLED_APPS += ('kombu.transport.django',) BROKER_URL = env("CELERY_BROKER_URL", default='django://') ########## END CELERY {% endif %} - # Your common stuff: Below this line define 3rd party library settings diff --git a/{{cookiecutter.repo_name}}/config/settings/local.py b/{{cookiecutter.repo_name}}/config/settings/local.py index 050ac23b..2124fcc6 100644 --- a/{{cookiecutter.repo_name}}/config/settings/local.py +++ b/{{cookiecutter.repo_name}}/config/settings/local.py @@ -58,12 +58,10 @@ INSTALLED_APPS += ('django_extensions', ) # TESTING # ------------------------------------------------------------------------------ TEST_RUNNER = 'django.test.runner.DiscoverRunner' - {% if cookiecutter.celery_support == "y" %} ########## CELERY # In development, all tasks will be executed locally by blocking until the task returns CELERY_ALWAYS_EAGER = True ########## END CELERY {% endif %} - # Your local stuff: Below this line define 3rd party library settings From 9bfca28f6f34affa74b950d46e7c821ace6034d4 Mon Sep 17 00:00:00 2001 From: Jay Date: Fri, 10 Jul 2015 11:30:42 +0200 Subject: [PATCH 3/3] refactored to load celery from an AppConfig --- .../config/settings/common.py | 1 + .../{{cookiecutter.repo_name}}/__init__.py | 4 --- .../{{cookiecutter.repo_name}}/celery.py | 26 --------------- .../taskman/__init__.py | 0 .../taskman/celery.py | 32 +++++++++++++++++++ 5 files changed, 33 insertions(+), 30 deletions(-) delete mode 100644 {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py create mode 100644 {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/__init__.py create mode 100644 {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/celery.py diff --git a/{{cookiecutter.repo_name}}/config/settings/common.py b/{{cookiecutter.repo_name}}/config/settings/common.py index 324a8efd..072cb75c 100644 --- a/{{cookiecutter.repo_name}}/config/settings/common.py +++ b/{{cookiecutter.repo_name}}/config/settings/common.py @@ -257,6 +257,7 @@ LOGGING = { } {% if cookiecutter.use_celery == "y" %} ########## CELERY +INSTALLED_APPS += ('{{cookiecutter.repo_name}}.taskman.celery.CeleryConfig',) # if you are not using the django database broker (e.g. rabbitmq, redis, memcached), you can remove the next line. INSTALLED_APPS += ('kombu.transport.django',) BROKER_URL = env("CELERY_BROKER_URL", default='django://') diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py index c51fe1a1..ebc6a5e1 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py @@ -1,7 +1,3 @@ # -*- coding: utf-8 -*- -{% if cookiecutter.use_celery == "y" %} -from __future__ import absolute_import -from {{cookiecutter.repo_name}}.celery import app as celery_app -{% endif %} __version__ = '{{ cookiecutter.version }}' __version_info__ = tuple([int(num) if num.isdigit() else num for num in __version__.replace('-', '.', 1).split('.')]) diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py deleted file mode 100644 index 6bdbff2e..00000000 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py +++ /dev/null @@ -1,26 +0,0 @@ -{% if cookiecutter.use_celery == "y" %} -from __future__ import absolute_import - -import os - -from celery import Celery - -# set the default Django settings module for the 'celery' program. -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local") - -from django.conf import settings - -app = Celery('{{cookiecutter.repo_name}}') - -# Using a string here means the worker will not have to -# pickle the object when using Windows. -app.config_from_object('django.conf:settings') -app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) - - -@app.task(bind=True) -def debug_task(self): - print('Request: {0!r}'.format(self.request)) -{% else %} -# use this as a starting point for your project with celery. -{% endif %} \ No newline at end of file diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/__init__.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/celery.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/celery.py new file mode 100644 index 00000000..cd238af8 --- /dev/null +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/celery.py @@ -0,0 +1,32 @@ +{% if cookiecutter.use_celery == "y" %} +from __future__ import absolute_import +import os +from celery import Celery +from django.apps import AppConfig +from django.conf import settings + +if not settings.configured: + # set the default Django settings module for the 'celery' program. + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local") + + +app = Celery('{{cookiecutter.repo_name}}') + + +class CeleryConfig(AppConfig): + name = '{{cookiecutter.repo_name}}.taskman' + verbose_name = 'Celery Config' + + def ready(self): + # Using a string here means the worker will not have to + # pickle the object when using Windows. + app.config_from_object('django.conf:settings') + app.autodiscover_tasks(lambda: settings.INSTALLED_APPS, force=True) + + +@app.task(bind=True) +def debug_task(self): + print('Request: {0!r}'.format(self.request)) +{% else %} +# use this as a starting point for your project with celery. +{% endif %} \ No newline at end of file