first-steps-with-django.rst 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. .. _django-first-steps:
  2. =========================
  3. First steps with Django
  4. =========================
  5. Using Celery with Django
  6. ========================
  7. .. note::
  8. Previous versions of Celery required a separate library to work with Django,
  9. but since 3.1 this is no longer the case. Django is supported out of the
  10. box now so this document only contains a basic way to integrate Celery and
  11. Django. You will use the same API as non-Django users so it's recommended that
  12. you read the :ref:`first-steps` tutorial
  13. first and come back to this tutorial. When you have a working example you can
  14. continue to the :ref:`next-steps` guide.
  15. To use Celery with your Django project you must first define
  16. an instance of the Celery library (called an "app")
  17. If you have a modern Django project layout like::
  18. - proj/
  19. - proj/__init__.py
  20. - proj/settings.py
  21. - proj/urls.py
  22. - manage.py
  23. then the recommended way is to create a new `proj/proj/celery.py` module
  24. that defines the Celery instance:
  25. :file: `proj/proj/celery.py`
  26. .. literalinclude:: ../../examples/django/proj/celery.py
  27. Then you need to import this app in your :file:`proj/proj/__init__.py`
  28. module. This ensures that the app is loaded when Django starts
  29. so that the ``@shared_task`` decorator (mentioned later) will use it:
  30. :file:`proj/proj/__init__.py`:
  31. .. literalinclude:: ../../examples/django/proj/__init__.py
  32. Note that this example project layout is suitable for larger projects,
  33. for simple projects you may use a single contained module that defines
  34. both the app and tasks, like in the :ref:`tut-celery` tutorial.
  35. Let's break down what happens in the first module,
  36. first we import absolute imports from the future, so that our
  37. ``celery.py`` module will not clash with the library:
  38. .. code-block:: python
  39. from __future__ import absolute_import
  40. Then we set the default :envvar:`DJANGO_SETTINGS_MODULE`
  41. for the :program:`celery` command-line program:
  42. .. code-block:: python
  43. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
  44. You don't need this line, but it saves you from always passing in the
  45. settings module to the celery program. It must always come before
  46. creating the app instances, which is what we do next:
  47. .. code-block:: python
  48. app = Celery('proj')
  49. This is our instance of the library, you can have many instances
  50. but there's probably no reason for that when using Django.
  51. We also add the Django settings module as a configuration source
  52. for Celery. This means that you don't have to use multiple
  53. configuration files, and instead configure Celery directly
  54. from the Django settings.
  55. You can pass the object directly here, but using a string is better since
  56. then the worker doesn't have to serialize the object when using Windows
  57. or execv:
  58. .. code-block:: python
  59. app.config_from_object('django.conf:settings')
  60. Next, a common practice for reusable apps is to define all tasks
  61. in a separate ``tasks.py`` module, and Celery does have a way to
  62. autodiscover these modules:
  63. .. code-block:: python
  64. app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
  65. With the line above Celery will automatically discover tasks in reusable
  66. apps if you follow the ``tasks.py`` convention::
  67. - app1/
  68. - app1/tasks.py
  69. - app1/models.py
  70. - app2/
  71. - app2/tasks.py
  72. - app2/models.py
  73. This way you do not have to manually add the individual modules
  74. to the :setting:`CELERY_IMPORTS` setting. The ``lambda`` so that the
  75. autodiscovery can happen only when needed, and so that importing your
  76. module will not evaluate the Django settings object.
  77. Finally, the ``debug_task`` example is a task that dumps
  78. its own request information. This is using the new ``bind=True`` task option
  79. introduced in Celery 3.1 to easily refer to the current task instance.
  80. Using the ``@shared_task`` decorator
  81. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  82. The tasks you write will probably live in reusable apps, and reusable
  83. apps cannot depend on the project itself, so you also cannot import your app
  84. instance directly.
  85. The ``@shared_task`` decorator lets you create tasks without having any
  86. concrete app instance:
  87. :file:`demoapp/tasks.py`:
  88. .. literalinclude:: ../../examples/django/demoapp/tasks.py
  89. .. seealso::
  90. You can find the full source code for the Django example project at:
  91. https://github.com/celery/celery/tree/3.1/examples/django/
  92. Using the Django ORM/Cache as a result backend.
  93. -----------------------------------------------
  94. The ``django-celery`` library defines result backends that
  95. uses the Django ORM and Django Cache frameworks.
  96. To use this with your project you need to follow these four steps:
  97. 1. Install the ``django-celery`` library:
  98. .. code-block:: bash
  99. $ pip install django-celery
  100. 2. Add ``djcelery`` to ``INSTALLED_APPS``.
  101. 3. Create the celery database tables.
  102. This step will create the tables used to store results
  103. when using the database result backend and the tables used
  104. by the database periodic task scheduler. You can skip
  105. this step if you don't use these.
  106. If you are using south_ for schema migrations, you'll want to:
  107. .. code-block:: bash
  108. $ python manage.py migrate djcelery
  109. For those who are not using south, a normal ``syncdb`` will work:
  110. .. code-block:: bash
  111. $ python manage.py syncdb
  112. 4. Configure celery to use the django-celery backend.
  113. For the database backend you must use:
  114. .. code-block:: python
  115. app.conf.update(
  116. CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
  117. )
  118. For the cache backend you can use:
  119. .. code-block:: python
  120. app.conf.update(
  121. CELERY_RESULT_BACKEND='djcelery.backends.cache:CacheBackend',
  122. )
  123. If you have connected Celery to your Django settings then you can
  124. add this directly into your settings module (without the
  125. ``app.conf.update`` part)
  126. .. _south: http://pypi.python.org/pypi/South/
  127. .. admonition:: Relative Imports
  128. You have to be consistent in how you import the task module, e.g. if
  129. you have ``project.app`` in ``INSTALLED_APPS`` then you also
  130. need to import the tasks ``from project.app`` or else the names
  131. of the tasks will be different.
  132. See :ref:`task-naming-relative-imports`
  133. Starting the worker process
  134. ===========================
  135. In a production environment you will want to run the worker in the background
  136. as a daemon - see :ref:`daemonizing` - but for testing and
  137. development it is useful to be able to start a worker instance by using the
  138. ``celery worker`` manage command, much as you would use Django's runserver:
  139. .. code-block:: bash
  140. $ celery -A proj worker -l info
  141. For a complete listing of the command-line options available,
  142. use the help command:
  143. .. code-block:: bash
  144. $ celery help
  145. Where to go from here
  146. =====================
  147. If you want to learn more you should continue to the
  148. :ref:`Next Steps <next-steps>` tutorial, and after that you
  149. can study the :ref:`User Guide <guide>`.