djangowhitenoise

How to server favicon.ico with Django and Whitenoise


I use whitenoise for static files and it works fine.

But how can I serve the /favicon.ico file?

There is a setting called WHITENOISE_ROOT, but I don't understand how to use it.

I would like to keep my nginx config simple and serve all files via gunicorn


Solution

  • If you want those files to be managed by collectstatic

    Let's assume after running collectstatic, your favicon.ico file ends up being copied in a root subdirectory, located in your STATIC_ROOT directory.

    Then, with:

    WHITENOISE_ROOT = os.path.join(STATIC_ROOT, 'root')
    

    Whitenoise will serve all files in STATIC_ROOT/root/ at the root of your application.

    In your case, STATIC_ROOT/root/favicon.ico will be served at /favicon.ico.

    If you don't want those files to be managed by collectstatic

    You can have a root_staticfiles folder in your BASE_DIR which simply contains the static files you want to serve at /.

    WHITENOISE_ROOT = os.path.join(BASE_DIR, 'root_staticfiles')
    

    In this case, Whitenoise will serve all files in BASE_DIR/root_staticfiles/ at the root of your application.

    Update about pathlib (2022-10-04)

    Since a while now, the default settings.py Django creates uses pathlib. To be consistent with it, one may replace os.join calls with / operators, eg.:

    WHITENOISE_ROOT = STATIC_ROOT / 'root'