Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make Django serve static files with Gunicorn?

I want to run my django project under gunicorn on localhost. I installed and integrated gunicorn. When I run:

python manage.py run_gunicorn 

It works but there are no any static files (css and js)

I disabled debug and template_debug in settings.py (made them false), but it is still same. Am I missing something?

I call statics like:

{{ STATIC_URL }}css/etc.... 
like image 816
alioguzhan Avatar asked Oct 09 '12 13:10

alioguzhan


People also ask

Can Uvicorn serve static files?

Uvicorn doesn't seem to support static file serving, so you might need something else too (see e.g. https://www.uvicorn.org/deployment/#running-behind-nginx).


2 Answers

When in development mode and when you are using some other server for local development add this to your url.py

from django.contrib.staticfiles.urls import staticfiles_urlpatterns  # ... the rest of your URLconf goes here ...  urlpatterns += staticfiles_urlpatterns() 

More info here

When in production you never, ever put gunicorn in front. Instead you use a server like nginx which dispatches requests to a pool of gunicorn workers and also serves the static files.

See here

like image 132
rantanplan Avatar answered Sep 18 '22 11:09

rantanplan


Whitenoise

Post v4.0

http://whitenoise.evans.io/en/stable/changelog.html#v4-0

The WSGI integration option for Django (which involved editing wsgi.py) has been removed. Instead, you should add WhiteNoise to your middleware list in settings.py and remove any reference to WhiteNoise from wsgi.py. See the documentation for more details. (The pure WSGI integration is still available for non-Django apps.)

Pre v4.0

Heroku recommends this method at: https://devcenter.heroku.com/articles/django-assets:

Your application will now serve static assets directly from Gunicorn in production. This will be perfectly adequate for most applications, but top-tier applications may want to explore using a CDN with Django-Storages.

Install with:

pip install whitenoise pip freeze > requirements.txt 

wsgi.py:

import os from django.core.wsgi import get_wsgi_application from whitenoise.django import DjangoWhiteNoise  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "free_books.settings") application = get_wsgi_application() application = DjangoWhiteNoise(application) 

Tested on Django 1.9.