diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 9bbbfd4bf..dc35a60c4 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 fd6c3eb05..d74c9f593 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 25233dbbf..b61ca3079 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 9c0859bcc..bc3b1c501 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 957d3110e..072cb75ce 100644 --- a/{{cookiecutter.repo_name}}/config/settings/common.py +++ b/{{cookiecutter.repo_name}}/config/settings/common.py @@ -255,5 +255,12 @@ 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://') +########## 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 8126310b6..2124fcc61 100644 --- a/{{cookiecutter.repo_name}}/config/settings/local.py +++ b/{{cookiecutter.repo_name}}/config/settings/local.py @@ -58,5 +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 diff --git a/{{cookiecutter.repo_name}}/requirements/base.txt b/{{cookiecutter.repo_name}}/requirements/base.txt index ddbdc62c4..fea97ad6c 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}}/taskman/__init__.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/__init__.py new file mode 100644 index 000000000..e69de29bb 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 000000000..cd238af86 --- /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