4

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

guettli
  • 25,042
  • 81
  • 346
  • 663

3 Answers3

6

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'
Le Minaw
  • 835
  • 7
  • 17
  • My answer was unclear: you don't actually add any file in `STATIC_ROOT`, because this folder will be populatd by the `collectstatic` command. – Le Minaw Feb 01 '21 at 22:02
2

You could as per this answer by hanleyhansen add the following line in a base template (used by all further templates):

<link rel="shortcut icon" type="image/png" href="{% static 'favicon.ico' %}"/>

Or you could write a redirect view like this answer by wim with some little modification:

from django.views.generic.base import RedirectView
from django.conf.urls.static import static

re_path(r'^favicon\.ico$', RedirectView.as_view(url=static('favicon.ico'), permanent=True))
Abdul Aziz Barkat
  • 19,475
  • 3
  • 20
  • 33
1

I have a django app that uses Whitenoise (hosted on Heroku) and serves my favicon from a separate folder from my static files.

Make a folder root_files at path BASE_DIR/root_files.

In settings.py:

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

For a real-life code example checkout Mozilla's Bedrock repo. They have favicons in BASE/root_files and configure WHITENOISE_ROOT in settings.py

Foot
  • 449
  • 4
  • 13