123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- .. _django-first-steps:
- =========================
- First steps with Django
- =========================
- Using Celery with Django
- ========================
- .. note::
- Previous versions of Celery required a separate library to work with Django,
- but since 3.1 this is no longer the case. Django is supported out of the
- box now so this document only contains a basic way to integrate Celery and
- Django. You will use the same API as non-Django users so it's recommended that
- you read the :ref:`first-steps` tutorial
- first and come back to this tutorial. When you have a working example you can
- continue to the :ref:`next-steps` guide.
- To use Celery with your Django project you must first define
- an instance of the Celery library (called an "app")
- 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`
- .. literalinclude:: ../../examples/django/proj/celery.py
- Then you need to import this app in your :file:`proj/proj/__init__.py`
- module. This ensures that the app is loaded when Django starts
- so that the ``@shared_task`` decorator (mentioned later) will use it:
- :file:`proj/proj/__init__.py`:
- .. literalinclude:: ../../examples/django/proj/__init__.py
- Note that this example project layout is suitable for larger projects,
- for simple projects you may use a single contained module that defines
- both the app and tasks, like in the :ref:`tut-celery` tutorial.
- Let's break down what happens in the first module,
- first we import absolute imports from the future, so that our
- ``celery.py`` module will not clash with the library:
- .. code-block:: python
- from __future__ import absolute_import
- Then we set the default :envvar:`DJANGO_SETTINGS_MODULE`
- for the :program:`celery` command-line program:
- .. code-block:: python
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
- You don't need this line, but it saves you from always passing in the
- settings module to the celery program. It must always come before
- creating the app instances, which is what we do next:
- .. code-block:: python
- app = Celery('proj')
- This is our instance of the library, you can have many instances
- but there's probably no reason for that when using Django.
- We also 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.
- You can pass the object directly here, but using a string is better since
- then the worker doesn't have to serialize the object when using Windows
- or execv:
- .. code-block:: python
- app.config_from_object('django.conf: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(lambda: settings.INSTALLED_APPS)
- With the line above Celery will automatically discover tasks in reusable
- apps if you follow the ``tasks.py`` convention::
- - app1/
- - app1/tasks.py
- - app1/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. The ``lambda`` so that the
- autodiscovery can happen only when needed, and so that importing your
- module will not evaluate the Django settings object.
- 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.
- Using the ``@shared_task`` decorator
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- The tasks you write will probably live in reusable apps, and reusable
- apps cannot depend on the project itself, so you also cannot import your app
- instance directly.
- The ``@shared_task`` decorator lets you create tasks without having any
- concrete app instance:
- :file:`demoapp/tasks.py`:
- .. literalinclude:: ../../examples/django/demoapp/tasks.py
- .. seealso::
- You can find the full source code for the Django example project at:
- https://github.com/celery/celery/tree/3.1/examples/django/
- 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 four 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.
- This step will create the tables used to store results
- when using the database result backend and the tables used
- by the database periodic task scheduler. You can skip
- this step if you don't use these.
- 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
- 4. Configure celery to use the django-celery backend.
- For the database backend you must use:
- .. code-block:: python
- app.conf.update(
- CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
- )
- For the cache backend you can use:
- .. code-block:: python
- app.conf.update(
- CELERY_RESULT_BACKEND='djcelery.backends.cache:CacheBackend',
- )
- If you have connected Celery to your Django settings then you can
- add this directly into your settings module (without the
- ``app.conf.update`` part)
- .. _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
- $ 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>`.
|