web-dev-qa-db-fra.com

Comment faire Django servir des fichiers statiques avec Gunicorn?

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....
52
alix

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

138
rantanplan

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:

  • La racine statique, la racine du média, le préfixe du chemin des fichiers statiques et le préfixe du chemin du fichier multimédia sont configurés dans vos paramètres .py
  • Une fois que nginx est configuré pour servir à partir du répertoire de contenu statique, vous devez exécuter "python manage.py collectstatic" dans la racine de votre projet afin que les fichiers statiques des différentes applications puissent être copiés dans le dossier statique

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.

12
Ngure Nyaga

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.

5
WhyNotHugo

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

1
frost-nzcr4