123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- .. _django-first-steps:
- =========================
- First steps with Django
- =========================
- Using Celery with Django
- ========================
- To use Celery with your Django project you must first define
- an instance of the Celery library.
- If you have a modern Django project layout like::
- - proj/
- - proj/__init__.py
- - proj/settings.py
- - proj/urls.py
- - manage.py
- then the recommended way is to create a new `proj/proj/celery.py` module
- that defines the Celery instance:
- :file: `proj/proj/celery.py`
- .. code-block:: python
- from celery import Celery
- from django.conf import settings
- app = Celery('proj.celery')
- app.config_from_object(settings)
- app.autodiscover_tasks(settings.INSTALLED_APPS, related_name='tasks')
- @celery.task(bind=True)
- def debug_task(self):
- print('Request: {0!r}'.format(self.request))
- Let's explain what happens here.
- First we create the Celery app instance:
- .. code-block:: python
- app = Celery('proj')
- Then we add the Django settings module as a configuration source
- for Celery. This means that you don't have to use multiple
- configuration files, and instead configure Celery directly
- from the Django settings.
- .. code-block:: python
- app.config_from_object(settings)
- Next, a common practice for reusable apps is to define all tasks
- in a separate ``tasks.py`` module, and Celery does have a way to
- autodiscover these modules:
- .. code-block:: python
- app.autodiscover_tasks(settings.INSTALLED_APPS, related_name='tasks')
- With the line above Celery will automatically discover tasks in reusable
- apps if you follow the ``tasks.py`` convention::
- - app1/
- - app1/tasks.py
- - app2/models.py
- - app2/
- - app2/tasks.py
- - app2/models.py
- This way you do not have to manually add the individual modules
- to the :setting:`CELERY_IMPORTS` setting.
- Finally, the ``debug_task`` example is a task that dumps
- its own request information. This is using the new ``bind=True`` task option
- introduced in Celery 3.1 to easily refer to the current task instance.
- The `celery` command
- --------------------
- To use the :program:`celery` command with Django you need to
- set up the :envvar:`DJANGO_SETTINGS_MODULE` environment variable:
- .. code-block:: bash
- $ DJANGO_SETTINGS_MODULE='proj.settings' celery -A proj worker -l info
- $ DJANGO_SETTINGS_MODULE='proj.settings' celery -A proj status
- If you find this inconvienient you can create a small wrapper script
- alongside ``manage.py`` that automatically binds to your app, e.g. ``proj/celery.py``
- :file:`proj/celery.py`
- .. code-block:: python
- #!/usr/bin/env python
- import os
- from proj.celery import celery
- if __name__ == '__main__':
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.celery')
- celery.start()
- Then you can use this command directly:
- .. code-block:: bash
- $ ./celery.py status
- Using the Django ORM/Cache as a result backend.
- -----------------------------------------------
- The ``django-celery`` library defines result backends that
- uses the Django ORM and Django Cache frameworks.
- To use this with your project you need to follow these three steps:
- 1. Install the ``django-celery`` library:
- .. code-block:: bash
- $ pip install django-celery
- 2. Add ``djcelery`` to ``INSTALLED_APPS``.
- 3. Create the celery database tables.
- If you are using south_ for schema migrations, you'll want to:
- .. code-block:: bash
- $ python manage.py migrate djcelery
- For those who are not using south, a normal ``syncdb`` will work:
- .. code-block:: bash
- $ python manage.py syncdb
- .. _south: http://pypi.python.org/pypi/South/
- .. admonition:: Relative Imports
- You have to be consistent in how you import the task module, e.g. if
- you have ``project.app`` in ``INSTALLED_APPS`` then you also
- need to import the tasks ``from project.app`` or else the names
- of the tasks will be different.
- See :ref:`task-naming-relative-imports`
- Starting the worker process
- ===========================
- In a production environment you will want to run the worker in the background
- as a daemon - see :ref:`daemonizing` - but for testing and
- development it is useful to be able to start a worker instance by using the
- ``celery worker`` manage command, much as you would use Django's runserver:
- .. code-block:: bash
- $ DJANGO_SETTINGS_MODULE='proj.settings' celery -A proj worker -l info
- For a complete listing of the command-line options available,
- use the help command:
- .. code-block:: bash
- $ celery help
- Where to go from here
- =====================
- If you want to learn more you should continue to the
- :ref:`Next Steps <next-steps>` tutorial, and after that you
- can study the :ref:`User Guide <guide>`.
|