123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- ===============
- Django settings
- ===============
- A Django settings file contains all the configuration of your Django
- installation. This document explains how settings work and which settings are
- available.
- The basics
- ==========
- A settings file is just a Python module with module-level variables.
- Here are a couple of example settings::
- ALLOWED_HOSTS = ["www.example.com"]
- DEBUG = False
- DEFAULT_FROM_EMAIL = "webmaster@example.com"
- .. note::
- If you set :setting:`DEBUG` to ``False``, you also need to properly set
- the :setting:`ALLOWED_HOSTS` setting.
- Because a settings file is a Python module, the following apply:
- * It doesn't allow for Python syntax errors.
- * It can assign settings dynamically using normal Python syntax.
- For example::
- MY_SETTING = [str(i) for i in range(30)]
- * It can import values from other settings files.
- .. _django-settings-module:
- Designating the settings
- ========================
- .. envvar:: DJANGO_SETTINGS_MODULE
- When you use Django, you have to tell it which settings you're using. Do this
- by using an environment variable, :envvar:`DJANGO_SETTINGS_MODULE`.
- The value of :envvar:`DJANGO_SETTINGS_MODULE` should be in Python path syntax,
- e.g. ``mysite.settings``. Note that the settings module should be on the
- Python :py:data:`sys.path`.
- The ``django-admin`` utility
- ----------------------------
- When using :doc:`django-admin </ref/django-admin>`, you can either set the
- environment variable once, or explicitly pass in the settings module each time
- you run the utility.
- Example (Unix Bash shell):
- .. code-block:: shell
- export DJANGO_SETTINGS_MODULE=mysite.settings
- django-admin runserver
- Example (Windows shell):
- .. code-block:: doscon
- set DJANGO_SETTINGS_MODULE=mysite.settings
- django-admin runserver
- Use the ``--settings`` command-line argument to specify the settings manually:
- .. code-block:: shell
- django-admin runserver --settings=mysite.settings
- .. _django-admin: ../django-admin/
- On the server (``mod_wsgi``)
- ----------------------------
- In your live server environment, you'll need to tell your WSGI
- application what settings file to use. Do that with ``os.environ``::
- import os
- os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
- Read the :doc:`Django mod_wsgi documentation
- </howto/deployment/wsgi/modwsgi>` for more information and other common
- elements to a Django WSGI application.
- Default settings
- ================
- A Django settings file doesn't have to define any settings if it doesn't need
- to. Each setting has a sensible default value. These defaults live in the
- module :source:`django/conf/global_settings.py`.
- Here's the algorithm Django uses in compiling settings:
- * Load settings from ``global_settings.py``.
- * Load settings from the specified settings file, overriding the global
- settings as necessary.
- Note that a settings file should *not* import from ``global_settings``, because
- that's redundant.
- Seeing which settings you've changed
- ------------------------------------
- The command ``python manage.py diffsettings`` displays differences between the
- current settings file and Django's default settings.
- For more, see the :djadmin:`diffsettings` documentation.
- Using settings in Python code
- =============================
- In your Django apps, use settings by importing the object
- ``django.conf.settings``. Example::
- from django.conf import settings
- if settings.DEBUG:
- # Do something
- ...
- Note that ``django.conf.settings`` isn't a module -- it's an object. So
- importing individual settings is not possible::
- from django.conf.settings import DEBUG # This won't work.
- Also note that your code should *not* import from either ``global_settings`` or
- your own settings file. ``django.conf.settings`` abstracts the concepts of
- default settings and site-specific settings; it presents a single interface.
- It also decouples the code that uses settings from the location of your
- settings.
- Altering settings at runtime
- ============================
- You shouldn't alter settings in your applications at runtime. For example,
- don't do this in a view::
- from django.conf import settings
- settings.DEBUG = True # Don't do this!
- The only place you should assign to settings is in a settings file.
- Security
- ========
- Because a settings file contains sensitive information, such as the database
- password, you should make every attempt to limit access to it. For example,
- change its file permissions so that only you and your web server's user can
- read it. This is especially important in a shared-hosting environment.
- Available settings
- ==================
- For a full list of available settings, see the :doc:`settings reference </ref/settings>`.
- Creating your own settings
- ==========================
- There's nothing stopping you from creating your own settings, for your own
- Django apps, but follow these guidelines:
- * Setting names must be all uppercase.
- * Don't reinvent an already-existing setting.
- For settings that are sequences, Django itself uses lists, but this is only
- a convention.
- .. _settings-without-django-settings-module:
- Using settings without setting :envvar:`DJANGO_SETTINGS_MODULE`
- ===============================================================
- In some cases, you might want to bypass the :envvar:`DJANGO_SETTINGS_MODULE`
- environment variable. For example, if you're using the template system by
- itself, you likely don't want to have to set up an environment variable
- pointing to a settings module.
- In these cases, you can configure Django's settings manually. Do this by
- calling:
- .. function:: django.conf.settings.configure(default_settings, **settings)
- Example::
- from django.conf import settings
- settings.configure(DEBUG=True)
- Pass ``configure()`` as many keyword arguments as you'd like, with each keyword
- argument representing a setting and its value. Each argument name should be all
- uppercase, with the same name as the settings described above. If a particular
- setting is not passed to ``configure()`` and is needed at some later point,
- Django will use the default setting value.
- Configuring Django in this fashion is mostly necessary -- and, indeed,
- recommended -- when you're using a piece of the framework inside a larger
- application.
- Consequently, when configured via ``settings.configure()``, Django will not
- make any modifications to the process environment variables (see the
- documentation of :setting:`TIME_ZONE` for why this would normally occur). It's
- assumed that you're already in full control of your environment in these
- cases.
- Custom default settings
- -----------------------
- If you'd like default values to come from somewhere other than
- ``django.conf.global_settings``, you can pass in a module or class that
- provides the default settings as the ``default_settings`` argument (or as the
- first positional argument) in the call to ``configure()``.
- In this example, default settings are taken from ``myapp_defaults``, and the
- :setting:`DEBUG` setting is set to ``True``, regardless of its value in
- ``myapp_defaults``::
- from django.conf import settings
- from myapp import myapp_defaults
- settings.configure(default_settings=myapp_defaults, DEBUG=True)
- The following example, which uses ``myapp_defaults`` as a positional argument,
- is equivalent::
- settings.configure(myapp_defaults, DEBUG=True)
- Normally, you will not need to override the defaults in this fashion. The
- Django defaults are sufficiently tame that you can safely use them. Be aware
- that if you do pass in a new default module, it entirely *replaces* the Django
- defaults, so you must specify a value for every possible setting that might be
- used in the code you are importing. Check in
- ``django.conf.settings.global_settings`` for the full list.
- Either ``configure()`` or :envvar:`DJANGO_SETTINGS_MODULE` is required
- ----------------------------------------------------------------------
- If you're not setting the :envvar:`DJANGO_SETTINGS_MODULE` environment
- variable, you *must* call ``configure()`` at some point before using any code
- that reads settings.
- If you don't set :envvar:`DJANGO_SETTINGS_MODULE` and don't call
- ``configure()``, Django will raise an ``ImportError`` exception the first time
- a setting is accessed.
- If you set :envvar:`DJANGO_SETTINGS_MODULE`, access settings values somehow,
- *then* call ``configure()``, Django will raise a ``RuntimeError`` indicating
- that settings have already been configured. There is a property for this
- purpose:
- .. attribute:: django.conf.settings.configured
- For example::
- from django.conf import settings
- if not settings.configured:
- settings.configure(myapp_defaults, DEBUG=True)
- Also, it's an error to call ``configure()`` more than once, or to call
- ``configure()`` after any setting has been accessed.
- It boils down to this: Use exactly one of either ``configure()`` or
- :envvar:`DJANGO_SETTINGS_MODULE`. Not both, and not neither.
- Calling ``django.setup()`` is required for "standalone" Django usage
- --------------------------------------------------------------------
- If you're using components of Django "standalone" -- for example, writing a
- Python script which loads some Django templates and renders them, or uses the
- ORM to fetch some data -- there's one more step you'll need in addition to
- configuring settings.
- After you've either set :envvar:`DJANGO_SETTINGS_MODULE` or called
- ``configure()``, you'll need to call :func:`django.setup()` to load your
- settings and populate Django's application registry. For example::
- import django
- from django.conf import settings
- from myapp import myapp_defaults
- settings.configure(default_settings=myapp_defaults, DEBUG=True)
- django.setup()
- # Now this script or any imported module can use any part of Django it needs.
- from myapp import models
- Note that calling ``django.setup()`` is only necessary if your code is truly
- standalone. When invoked by your web server, or through :doc:`django-admin
- </ref/django-admin>`, Django will handle this for you.
- .. admonition:: ``django.setup()`` may only be called once.
- Therefore, avoid putting reusable application logic in standalone scripts
- so that you have to import from the script elsewhere in your application.
- If you can't avoid that, put the call to ``django.setup()`` inside an
- ``if`` block::
- if __name__ == "__main__":
- import django
- django.setup()
- .. seealso::
- :doc:`The Settings Reference </ref/settings>`
- Contains the complete list of core and contrib app settings.
|