|  | @@ -58,41 +58,11 @@ Is celery for Django only?
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  **Answer:** No.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -You can use all of the features without using Django.
 | 
	
		
			
				|  |  | +Celery does not depend on Django anymore. To use Celery with Django you have
 | 
	
		
			
				|  |  | +to use the `django-celery`_ package:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Why is Django a dependency?
 | 
	
		
			
				|  |  | ----------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Celery uses the Django ORM for database access when using the database result
 | 
	
		
			
				|  |  | -backend, the Django cache framework when using the cache result backend, and the Django signal
 | 
	
		
			
				|  |  | -dispatch mechanisms for signaling.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -This doesn't mean you need to have a Django project to use celery, it
 | 
	
		
			
				|  |  | -just means that sometimes we use internal Django components.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -The long term plan is to replace these with other solutions, (e.g. `SQLAlchemy`_ as the ORM,
 | 
	
		
			
				|  |  | -and `louie`_, for signaling). The celery distribution will be split into two:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    * celery
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        The core. Using SQLAlchemy for the database backend.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    * django-celery
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Celery integration for Django, using the Django ORM for the database
 | 
	
		
			
				|  |  | -        backend.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -We're currently seeking people with `SQLAlchemy`_ experience, so please
 | 
	
		
			
				|  |  | -contact the project if you want this done sooner.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -The reason for the split is for purity only. It shouldn't affect you much as a
 | 
	
		
			
				|  |  | -user, so please don't worry about the Django dependency, just have a good time
 | 
	
		
			
				|  |  | -using celery.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -.. _`SQLAlchemy`: http://www.sqlalchemy.org/
 | 
	
		
			
				|  |  | -.. _`louie`: http://pypi.python.org/pypi/Louie/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +.. _`django-celery`: http://pypi.python.org/pypi/django-celery
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Do I have to use AMQP/RabbitMQ?
 | 
	
		
			
				|  |  |  -------------------------------
 | 
	
	
		
			
				|  | @@ -222,9 +192,7 @@ with::
 | 
	
		
			
				|  |  |  Why won't my Task run?
 | 
	
		
			
				|  |  |  ----------------------
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -**Answer:** Did you register the task in the applications ``tasks.py`` module?
 | 
	
		
			
				|  |  | -(or in some other module Django loads by default, like ``models.py``?).
 | 
	
		
			
				|  |  | -Also there might be syntax errors preventing the tasks module being imported.
 | 
	
		
			
				|  |  | +**Answer:** There might be syntax errors preventing the tasks module being imported.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  You can find out if celery is able to run the task by executing the
 | 
	
		
			
				|  |  |  task manually:
 | 
	
	
		
			
				|  | @@ -601,121 +569,6 @@ could also be useful as a source of information.
 | 
	
		
			
				|  |  |  .. _`Standard Exchange Types`: http://bit.ly/EEWca
 | 
	
		
			
				|  |  |  .. _`RabbitMQ FAQ`: http://www.rabbitmq.com/faq.html
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Can I use celery without Django?
 | 
	
		
			
				|  |  | ---------------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -**Answer:** Yes.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Celery uses something called loaders to read/setup configuration, import
 | 
	
		
			
				|  |  | -modules that register tasks and to decide what happens when a task is
 | 
	
		
			
				|  |  | -executed. Currently there are two loaders, the default loader and the Django
 | 
	
		
			
				|  |  | -loader. If you want to use celery without a Django project, you either have to
 | 
	
		
			
				|  |  | -use the default loader, or write a loader of your own.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -The rest of this answer describes how to use the default loader.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -While it is possible to use Celery from outside of Django, we still need
 | 
	
		
			
				|  |  | -Django itself to run, this is to use the ORM and cache-framework.
 | 
	
		
			
				|  |  | -Duplicating these features would be time consuming and mostly pointless, so
 | 
	
		
			
				|  |  | -while me might rewrite these in the future, this is a good solution in the
 | 
	
		
			
				|  |  | -mean time.
 | 
	
		
			
				|  |  | -Install Django using your favorite install tool, ``easy_install``, ``pip``, or
 | 
	
		
			
				|  |  | -whatever::
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # easy_install django # as root
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -You need a configuration file named ``celeryconfig.py``, either in the
 | 
	
		
			
				|  |  | -directory you run ``celeryd`` in, or in a Python library path where it is
 | 
	
		
			
				|  |  | -able to find it. The configuration file can contain any of the settings
 | 
	
		
			
				|  |  | -described in :mod:`celery.conf`. In addition; if you're using the
 | 
	
		
			
				|  |  | -database backend you have to configure the database. Here is an example
 | 
	
		
			
				|  |  | -configuration using the database backend with MySQL:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -.. code-block:: python
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # Broker configuration
 | 
	
		
			
				|  |  | -    BROKER_HOST = "localhost"
 | 
	
		
			
				|  |  | -    BROKER_PORT = "5672"
 | 
	
		
			
				|  |  | -    BROKER_VHOST = "celery"
 | 
	
		
			
				|  |  | -    BROKER_USER = "celery"
 | 
	
		
			
				|  |  | -    BROKER_PASSWORD = "celerysecret"
 | 
	
		
			
				|  |  | -    CARROT_BACKEND="amqp"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # Using the database backend.
 | 
	
		
			
				|  |  | -    CELERY_RESULT_BACKEND = "database"
 | 
	
		
			
				|  |  | -    DATABASE_ENGINE = "mysql" # see Django docs for a description of these.
 | 
	
		
			
				|  |  | -    DATABASE_NAME = "mydb"
 | 
	
		
			
				|  |  | -    DATABASE_HOST = "mydb.example.org"
 | 
	
		
			
				|  |  | -    DATABASE_USER = "myuser"
 | 
	
		
			
				|  |  | -    DATABASE_PASSWORD = "mysecret"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # Number of processes that processes tasks simultaneously.
 | 
	
		
			
				|  |  | -    CELERYD_CONCURRENCY = 8
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # Modules to import when celeryd starts.
 | 
	
		
			
				|  |  | -    # This must import every module where you register tasks so celeryd
 | 
	
		
			
				|  |  | -    # is able to find and run them.
 | 
	
		
			
				|  |  | -    CELERY_IMPORTS = ("mytaskmodule1", "mytaskmodule2")
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -With this configuration file in the current directory you have to
 | 
	
		
			
				|  |  | -run ``celeryinit`` to create the database tables::
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    $ celeryinit
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -At this point you should be able to successfully run ``celeryd``::
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    $ celeryd --loglevel=INFO
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -and send a task from a python shell (note that it must be able to import
 | 
	
		
			
				|  |  | -``celeryconfig.py``):
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    >>> from celery.task.builtins import PingTask
 | 
	
		
			
				|  |  | -    >>> result = PingTask.apply_async()
 | 
	
		
			
				|  |  | -    >>> result.get()
 | 
	
		
			
				|  |  | -    'pong'
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -The celery test-suite is failing
 | 
	
		
			
				|  |  | ---------------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -**Answer**: If you're running tests from your Django project, and the celery
 | 
	
		
			
				|  |  | -test suite is failing in that context, then follow the steps below. If the
 | 
	
		
			
				|  |  | -celery tests are failing in another context, please report an issue to our
 | 
	
		
			
				|  |  | -issue tracker at GitHub:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    http://github.com/ask/celery/issues/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -That Django is running tests for all applications in ``INSTALLED_APPS``
 | 
	
		
			
				|  |  | -by default is a pet peeve for many. You should use a test runner that either
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    1) Explicitly lists the apps you want to run tests for, or
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    2) Make a test runner that skips tests for apps you don't want to run.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -For example the test runner that celery is using:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    http://bit.ly/NVKep
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -To use this test runner, add the following to your ``settings.py``:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -.. code-block:: python
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    TEST_RUNNER = "celery.tests.runners.run_tests"
 | 
	
		
			
				|  |  | -    TEST_APPS = (
 | 
	
		
			
				|  |  | -        "app1",
 | 
	
		
			
				|  |  | -        "app2",
 | 
	
		
			
				|  |  | -        "app3",
 | 
	
		
			
				|  |  | -        "app4",
 | 
	
		
			
				|  |  | -    )
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Or, if you just want to skip the celery tests:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -.. code-block:: python
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    INSTALLED_APPS = (.....)
 | 
	
		
			
				|  |  | -    TEST_RUNNER = "celery.tests.runners.run_tests"
 | 
	
		
			
				|  |  | -    TEST_APPS = filter(lambda k: k != "celery", INSTALLED_APPS)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  Can I change the interval of a periodic task at runtime?
 | 
	
		
			
				|  |  |  --------------------------------------------------------
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -824,42 +677,3 @@ and they will not be re-run unless you have the ``acks_late`` option set.
 | 
	
		
			
				|  |  |  How do I run celeryd in the background on [platform]?
 | 
	
		
			
				|  |  |  -----------------------------------------------------
 | 
	
		
			
				|  |  |  **Answer**: Please see :doc:`cookbook/daemonizing`.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Django
 | 
	
		
			
				|  |  | -======
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Generating a template in a task doesn't seem to respect my i18n settings?
 | 
	
		
			
				|  |  | --------------------------------------------------------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -**Answer**: To enable the Django translation machinery you need to activate
 | 
	
		
			
				|  |  | -it with a language. **Note**: Be sure to reset to the previous language when
 | 
	
		
			
				|  |  | -done.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    >>> from django.utils import translation
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    >>> prev_language = translation.get_language()
 | 
	
		
			
				|  |  | -    >>> translation.activate(language)
 | 
	
		
			
				|  |  | -    >>> try:
 | 
	
		
			
				|  |  | -    ...     render_template()
 | 
	
		
			
				|  |  | -    ... finally:
 | 
	
		
			
				|  |  | -            translation.activate(prev_language)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -The common pattern here would be for the task to take a ``language``
 | 
	
		
			
				|  |  | -argument:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -.. code-block:: python
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    from celery.decorators import task
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    from django.utils import translation
 | 
	
		
			
				|  |  | -    from django.template.loader import render_to_string
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @task()
 | 
	
		
			
				|  |  | -    def generate_report(template="report.html", language=None):
 | 
	
		
			
				|  |  | -        prev_language = translation.get_language()
 | 
	
		
			
				|  |  | -        language and translation.activate(language)
 | 
	
		
			
				|  |  | -        try:
 | 
	
		
			
				|  |  | -            report = render_to_string(template)
 | 
	
		
			
				|  |  | -        finally:
 | 
	
		
			
				|  |  | -            translation.activate(prev_language)
 | 
	
		
			
				|  |  | -        save_report_somewhere(report)
 |