=========================================================How to manage static files (e.g. images, JavaScript, CSS)=========================================================Websites generally need to serve additional files such as images, JavaScript,or CSS. In Django, we refer to these files as "static files". Django provides:mod:`django.contrib.staticfiles` to help you manage them.This page describes how you can serve these static files.Configuring static files========================#. Make sure that ``django.contrib.staticfiles`` is included in your:setting:`INSTALLED_APPS`.#. In your settings file, define :setting:`STATIC_URL`, for example::STATIC_URL = 'static/'#. In your templates, use the :ttag:`static` template tag to build the URL forthe given relative path using the configured :setting:`STATICFILES_STORAGE`... _staticfiles-in-templates:.. code-block:: html+django{% load static %}<img src="{% static 'my_app/example.jpg' %}" alt="My image">#. Store your static files in a folder called ``static`` in your app. Forexample ``my_app/static/my_app/example.jpg``... admonition:: Serving the filesIn addition to these configuration steps, you'll also need to actuallyserve the static files.During development, if you use :mod:`django.contrib.staticfiles`, this willbe done automatically by :djadmin:`runserver` when :setting:`DEBUG` is setto ``True`` (see :func:`django.contrib.staticfiles.views.serve`).This method is **grossly inefficient** and probably **insecure**,so it is **unsuitable for production**.See :doc:`/howto/static-files/deployment` for proper strategies to servestatic files in production environments.Your project will probably also have static assets that aren't tied to aparticular app. In addition to using a ``static/`` directory inside your apps,you can define a list of directories (:setting:`STATICFILES_DIRS`) in yoursettings file where Django will also look for static files. For example::STATICFILES_DIRS = [BASE_DIR / "static",'/var/www/static/',]See the documentation for the :setting:`STATICFILES_FINDERS` setting fordetails on how ``staticfiles`` finds your files... admonition:: Static file namespacingNow we *might* be able to get away with putting our static files directlyin ``my_app/static/`` (rather than creating another ``my_app``subdirectory), but it would actually be a bad idea. Django will use thefirst static file it finds whose name matches, and if you had a static filewith the same name in a *different* application, Django would be unable todistinguish between them. We need to be able to point Django at the rightone, and the best way to ensure this is by *namespacing* them. That is,by putting those static files inside *another* directory named for theapplication itself.You can namespace static assets in :setting:`STATICFILES_DIRS` byspecifying :ref:`prefixes <staticfiles-dirs-prefixes>`... _serving-static-files-in-development:Serving static files during development=======================================If you use :mod:`django.contrib.staticfiles` as explained above,:djadmin:`runserver` will do this automatically when :setting:`DEBUG` is setto ``True``. If you don't have ``django.contrib.staticfiles`` in:setting:`INSTALLED_APPS`, you can still manually serve static files using the:func:`django.views.static.serve` view.This is not suitable for production use! For some common deploymentstrategies, see :doc:`/howto/static-files/deployment`.For example, if your :setting:`STATIC_URL` is defined as ``static/``, you cando this by adding the following snippet to your ``urls.py``::from django.conf import settingsfrom django.conf.urls.static import staticurlpatterns = [# ... the rest of your URLconf goes here ...] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT).. note::This helper function works only in debug mode and only ifthe given prefix is local (e.g. ``static/``) and not a URL (e.g.``http://static.example.com/``).Also this helper function only serves the actual :setting:`STATIC_ROOT`folder; it doesn't perform static files discovery like:mod:`django.contrib.staticfiles`.Finally, static files are served via a wrapper at the WSGI applicationlayer. As a consequence, static files requests do not pass through thenormal :doc:`middleware chain </topics/http/middleware>`... _serving-uploaded-files-in-development:Serving files uploaded by a user during development===================================================During development, you can serve user-uploaded media files from:setting:`MEDIA_ROOT` using the :func:`django.views.static.serve` view.This is not suitable for production use! For some common deploymentstrategies, see :doc:`/howto/static-files/deployment`.For example, if your :setting:`MEDIA_URL` is defined as ``media/``, you can dothis by adding the following snippet to your :setting:`ROOT_URLCONF`::from django.conf import settingsfrom django.conf.urls.static import staticurlpatterns = [# ... the rest of your URLconf goes here ...] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT).. note::This helper function works only in debug mode and only ifthe given prefix is local (e.g. ``media/``) and not a URL (e.g.``http://media.example.com/``)... _staticfiles-testing-support:Testing=======When running tests that use actual HTTP requests instead of the built-intesting client (i.e. when using the built-in :class:`LiveServerTestCase<django.test.LiveServerTestCase>`) the static assets need to be served alongthe rest of the content so the test environment reproduces the real one asfaithfully as possible, but ``LiveServerTestCase`` has only very basic staticfile-serving functionality: It doesn't know about the finders feature of the``staticfiles`` application and assumes the static content has already beencollected under :setting:`STATIC_ROOT`.Because of this, ``staticfiles`` ships its own:class:`django.contrib.staticfiles.testing.StaticLiveServerTestCase`, a subclassof the built-in one that has the ability to transparently serve all the assetsduring execution of these tests in a way very similar to what we get atdevelopment time with ``DEBUG = True``, i.e. without having to collect themusing :djadmin:`collectstatic` first.Deployment==========:mod:`django.contrib.staticfiles` provides a convenience management commandfor gathering static files in a single directory so you can serve them easily.#. Set the :setting:`STATIC_ROOT` setting to the directory from which you'dlike to serve these files, for example::STATIC_ROOT = "/var/www/example.com/static/"#. Run the :djadmin:`collectstatic` management command::$ python manage.py collectstaticThis will copy all files from your static folders into the:setting:`STATIC_ROOT` directory.#. Use a web server of your choice to serve thefiles. :doc:`/howto/static-files/deployment` covers some common deploymentstrategies for static files.Learn more==========This document has covered the basics and some common usage patterns. Forcomplete details on all the settings, commands, template tags, and other piecesincluded in :mod:`django.contrib.staticfiles`, see :doc:`the staticfilesreference </ref/contrib/staticfiles>`.