[PYTHON] Lorsque je déploie une application Django sur Apache2 et qu'elle ne lit plus les fichiers statiques

Notez ce qu'il faut faire si vous arrêtez de lire les fichiers CSS et image après avoir créé une application Django conformément au didacticiel et l'avoir déployée dans un environnement de production.

Cette diapositive est facile à comprendre, il est donc préférable de la lire https://tell-k.github.io/djangocongressjp2019/#43

1. Gestion des fichiers statiques dans Django

Django gère les fichiers statiques différemment pendant le développement et en production. Pour changer ceci est DEBUG = True / False dans setting.py.

/ Statique / lorsque DEBUG = True

Comme django est conçu pour être développé en le divisant en dossiers pour chaque application, les fichiers CSS et image, qui sont des fichiers statiques, sont également placés dans le dossier de l'application. Par conséquent, alors que DEBUG = True, ce qui signifie en cours de développement, tous les dossiers nommés / static / sous le dossier spécifié par STATIC_URL et STATICFILES_DIRS écrits dans setting.py sont gérés par Alias appelé / static /.

Par exemple, si vous avez un fichier comme project / app1 / static / base.css Il le traite comme s'il s'agissait de http://hoge.com/static/base.css.

Pourquoi django ne livre pas / statique / en production

Si vous utilisez cette fonction dans l'environnement de production, le processus principal sera inutilement surchargé et cela peut entraîner des vulnérabilités, vous devez donc désactiver cette fonction dans l'environnement de production. Si vous déployez une application Django avec Apache2 etc. pour forcer cela, seul l'exemple d'écran sera affiché à moins que DEBUG = False.

/ Statique / quand DEBUG = False

Lorsque DEBUG = True, Django a fourni un fichier statique avec Alias / static /, mais lorsque DEBUG = False, il ne sera pas fourni, donc dans l'exemple précédent, http://hoge.com/static/ Cela signifie que base.css n'existe pas. Si vous fournissez ceci avec Apache etc., vous pouvez obtenir la même opération que pendant le développement.

2. Procédure d'installation d'Apache2

Collectez les fichiers statiques en un seul endroit avec python manage.py collectstatic et écrivez l'emplacement collecté dans apahce2.conf afin qu'Apache2 le fournisse en tant que / static /. C'est la même chose que le Tutoriel Django Girls .

2-1. Collectez les fichiers statiques en un seul endroit

Créez un dossier appelé statique directement sous le projet comme indiqué ci-dessous et récupérez-le.

/home/xxxx/django/proj1/


proj1
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── myvenv
│   └── ...
├── static Où collecter les fichiers statiques
│   ├── hoge.jpg
│   └── base.css
└── requirements.txt

Spécifie où collecter les fichiers statiques (STATIC_ROOT). Dans ce qui suit, / home / xxxx / django / proj1 / static / sera STATIC_ROOT.

proj1/mysite/setting.py


STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Lorsque vous exécutez la commande collectstatics, les fichiers statiques sont collectés dans le PATH de STATIC_ROOT.

terminal


cd /home/xxxx/django/proj1
python manage.py collectstatics

2-2. Ajoutez l'emplacement du fichier statique à apache2.conf

Je veux traiter /home/xxxx/django/proj1/static/base.css comme http://hoge.com/static/base.css, alors ajoutez Alias au dossier et donnez la permission (Exiger tout accordé).

/etc/apache2/apache2.conf


Alias /static/ /home/xxxx/django/proj1/static/
<Directory /home/xxxx/django/proj1/static>
    Require all granted
</Directory>

J'ai changé les paramètres, alors redémarrez Apache2.

terminal


sudo /etc/init.d/apache2 restart

2-3. Si cela ne fonctionne pas

Puisque collectstatics copie simplement le fichier, vous pouvez vérifier l'opération en vérifiant si le fichier est copié dans STATIC_ROOT.

Si vous n'avez pas réussi à enregistrer Apache2, vous devriez voir Django wsgi Apache2: 'AH01630: client refusé par la configuration du serveur' dans votre journal des erreurs Apache2. Assurez-vous que le contenu de apache2.conf est le même que STATIC_ROOT.

Si vous conservez les paramètres par défaut, vous pouvez voir le journal des erreurs Apache2 ci-dessous.

terminal


tail -f /var/log/apache2/error.log

Recommended Posts

Lorsque je déploie une application Django sur Apache2 et qu'elle ne lit plus les fichiers statiques
Déployer l'application Django créée avec PTVS sur Azure
Déployez des applications Web en temps réel avec Swampdragon x Apache
Gestion des fichiers statiques lors du déploiement en production avec Django
Créez un script de déploiement avec fabric et cuisine et réutilisez-le
Lorsque j'ai mis Django dans mon répertoire personnel, je suis devenu accro à un fichier statique avec une erreur d'autorisation
Créez un fichier temporaire avec django sous forme de zip et renvoyez-le
Un mémorandum lors de l'acquisition automatique avec du sélénium
Création et déploiement d'applications Django (PTVS) à l'aide du stockage Azure Table
Créez une application de scraping avec Python + Django + AWS et modifiez les tâches
J'ai créé un chat chat bot avec Tensor2Tensor et cette fois cela a fonctionné
Créez une application Django sur Docker et déployez-la sur AWS Fargate
Aucune raison de penser en écrivant un robot avec Django et Celery
Créer une application Todo avec Django ④ Implémenter la fonction de création de dossier et de tâche
J'ai créé une application pour les étrangers visitant le Japon à Hackason et j'ai gagné un prix, mais quand j'y réfléchissais attentivement, c'était inutile
CentOS 6.4, Python 2.7.3, Apache, mod_wsgi, Django
Je ne peux plus déployer avec le moteur d'application Google
J'ai fait une application WEB avec Django
Quand j'ai essayé de créer un VPC avec AWS CDK mais que je n'ai pas pu le faire
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
Je veux écrire un élément dans un fichier avec numpy et le vérifier.
Faisons une application qui affaiblit les nerfs avec Vue.js et Django-Rest-Framework [Partie 1] ~ Django setup ~
J'obtiens une UnicodeDecodeError lors de l'exécution avec mod_wsgi
Configurer un module avec plusieurs fichiers dans Django
Je souhaite télécharger une application Django sur heroku
J'ai créé et publié une image Docker qui lit RSS et tweete automatiquement régulièrement.
[Introduction au trading système] J'ai dessiné un oscillateur stochastique avec python et joué avec ♬
Création d'une application Web qui mappe les informations sur les événements informatiques avec Vue et Flask
[Art de la coquille] Seulement quand c'est un multiple de 3 et un nombre avec 3 devient stupide
Créez rapidement un tableau de bord d'analyse de données Python avec Streamlit et déployez-le sur AWS
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)