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