| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 | .. _django-first-steps:========================= First steps with Django=========================Using Celery with Django========================To use Celery with your Django project you must first definean 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.pythen the recommended way is to create a new `proj/proj/celery.py` modulethat defines the Celery instance::file: `proj/proj/celery.py`.. code-block:: python    from celery import Celery    from django.conf import settings    celery = Celery('proj.celery')    celery.config_from_object(settings)    celery.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    celery = Celery('proj')Then we add the Django settings module as a configuration sourcefor Celery.  This means that you don't have to use multipleconfiguration files, and instead configure Celery directlyfrom the Django settings... code-block:: python    celery.config_from_object(settings)Next, a common practice for reusable apps is to define all tasksin a separate ``tasks.py`` module, and Celery does have a way toautodiscover these modules:.. code-block:: python    celery.autodiscover_tasks(settings.INSTALLED_APPS, related_name='tasks')With the line above Celery will automatically discover tasks in reusableapps if you follow the ``tasks.py`` convention::    - app1/        - app1/tasks.py        - app2/models.py    - app2/        - app2/tasks.py        - app2/models.pyThis way you do not have to manually add the individual modulesto the :setting:`CELERY_IMPORTS` setting.Finally, the ``debug_task`` example is a task that dumpsits own request information.  This is using the new ``bind=True`` task optionintroduced 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 toset 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 statusIf you find this inconvienient you can create a small wrapper scriptalongside ``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 statusUsing the Django ORM/Cache as a result backend.-----------------------------------------------The ``django-celery`` library defines result backends thatuses 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 backgroundas a daemon - see :ref:`daemonizing` - but for testing anddevelopment 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 infoFor a complete listing of the command-line options available,use the help command:.. code-block:: bash    $ celery helpWhere to go from here=====================If you want to learn more you should continue to the:ref:`Next Steps <next-steps>` tutorial, and after that youcan study the :ref:`User Guide <guide>`.
 |