Je veux exécuter mon projet Django sous gunicorn sur localhost. J'ai installé et intégré gunicorn. Quand je lance:
python manage.py run_gunicorn
Cela fonctionne mais il n'y a aucun fichier statique (css et js)
J'ai désactivé le débogage et template_debug dans settings.py (les a rendus faux), mais c'est toujours la même chose. Suis-je en train de manquer quelque chose?
J'appelle la statique comme:
{{ STATIC_URL }}css/etc....
En mode de développement et lorsque vous utilisez un autre serveur pour le développement local ajoutez ceci à votre url.py
from Django.contrib.staticfiles.urls import staticfiles_urlpatterns
# ... the rest of your URLconf goes here ...
urlpatterns += staticfiles_urlpatterns()
Plus d'infos ici
Lorsque vous êtes en production vous ne mettez jamais, jamais, le gunicorn devant. Au lieu de cela, vous utilisez un serveur comme nginx qui envoie des requêtes à un pool de travailleurs gunicorn et sert également les fichiers statiques.
Voir ici
Whitenoise
Post v4.0
http://whitenoise.evans.io/en/stable/changelog.html#v4-
L'option d'intégration WSGI pour Django (qui impliquait la modification de wsgi.py) a été supprimée. À la place, vous devez ajouter WhiteNoise à votre liste de middleware dans settings.py et supprimer toute référence à WhiteNoise de wsgi. py. Voir la documentation pour plus de détails. (L'intégration WSGI pure est toujours disponible pour les applications non-Django.)
Pré v4.0
Heroku recommande cette méthode sur: https://devcenter.heroku.com/articles/Django-assets :
Votre application servira désormais des actifs statiques directement depuis Gunicorn en production. Cela conviendra parfaitement à la plupart des applications, mais les applications de niveau supérieur peuvent vouloir explorer l'utilisation d'un CDN avec Django-Storages.
Installer avec:
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)
Testé sur Django 1.9.
Le gunicorn devrait être utilisé pour servir l 'python "application" elle-même, tandis que les fichiers statiques sont servis par un serveur de fichiers statiques (comme Nginx).
Il y a un bon guide ici: http://honza.ca/2011/05/deploying-Django-with-nginx-and-gunicorn
Ceci est un extrait d'une de mes configurations:
upstream app_server_djangoapp {
server localhost:8000 fail_timeout=0;
}
server {
listen < server port goes here >;
server_name < server name goes here >;
access_log /var/log/nginx/guni-access.log;
error_log /var/log/nginx/guni-error.log info;
keepalive_timeout 5;
root < application root directory goes here >;
location /static {
autoindex on;
alias < static folder directory goes here >;
}
location /media {
autoindex on;
alias < user uploaded media file directory goes here >;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_Host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app_server_djangoapp;
break;
}
}
}
Quelques notes:
En conclusion: bien qu'il soit possible de servir des fichiers statiques à partir de gunicorn (en activant une vue de service de fichiers statiques de débogage uniquement), cela est considéré comme une mauvaise pratique en production.
Je l'ai utilisé pour mon environnement de développement (qui utilise gunicorn):
from Django.conf import settings
from Django.contrib.staticfiles.handlers import StaticFilesHandler
from Django.core.wsgi import get_wsgi_application
if settings.DEBUG:
application = StaticFilesHandler(get_wsgi_application())
else:
application = get_wsgi_application()
Et puis exécutez gunicorn myapp.wsgi
. Cela fonctionne similaire à réponse de @ rantanplan , cependant, il n'exécute aucun middleware lors de l'exécution de fichiers statiques.
Depuis Django 1.3 il y a Django/conf/urls/static.py qui gère les fichiers statiques en mode DEBUG:
from Django.conf import settings
from Django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
En savoir plus https://docs.djangoproject.com/en/2.0/howto/static-files/#serving-static-files-during-development