La résolution de ce problème lorsqu'il s'agit du serveur de production serait d'utiliser collectstatic comme déjà mentionné qu'il a utilisé et résolu ou de donner des autorisations aux dossiers. Cependant si votre solution est dans un environnement local, la solution peut être acquise en configurant le MEDIA
local répertoire dans le settings.py
fichier qui agit sur le serveur local.
Donc, ajouterait ces deux lignes dans le fichier de configuration local comme @Nic Scozzaro l'a mentionné :
MEDIA_ROOT = os.path.join (BASE_DIR, 'media')
STATIC_ROOT = os.path.join (BASE_DIR, 'static')
Après la configuration, redémarrez les services pour appliquer les correctifs.
Créez un répertoire 'MEDIA' à la racine de votre projet.Puis définissez :
MEDIA_ROOT = os.path.join(BASE_DIR,'MEDIA')
Pour savoir à quel utilisateur vous êtes connecté :
$ whoami
ubuntu
Et en plus de votre solution, si vous utilisez une instance AWS, vous devez ajouter votre utilisateur au groupe pour pouvoir accéder à ce dossier :
Création d'un groupe pour les utilisateurs des services Web (varwwwusers)
$ sudo groupadd varwwwusers
Modifier le dossier www et le faire appartenir à varwwwusers
$ sudo chgrp -R varwwwusers /var/www/
www-data est le serveur qui effectue les requêtes Django, ajoutez-le au groupe
$ sudo adduser www-data varwwwusers
Modifier la politique de dossier
$ sudo chmod -R 770 /var/www/
Ajouter ubuntu au groupe de varwwwusers
$ usermod -a -G varwwwusers ubuntu
J'espère que cela vous aidera !
J'ai résolu cela moi-même à la fin.
Lors de l'exécution sur les machines de développement, j'utilise en fait les privilèges de mon utilisateur actuel. Cependant, lors de l'exécution sur le serveur de déploiement, j'exécute en fait wsgi
, ce qui signifie qu'il s'exécute en utilisant www-data
les privilèges de.
www-data
n'est ni le propriétaire ni dans le groupe d'utilisateurs qui possèdent /var/www
. Cela signifie que www-data
est traité comme other
et a les autorisations définies sur d'autres.
Le MAUVAIS la solution serait de faire :
sudo chmod -R 777 /var/www/
Cela donnerait à chacun un accès complet à tout en /var/www/
, ce qui est une très mauvaise idée.
Un autre MAUVAIS la solution serait de faire :
sudo chown -R www-data /var/www/
Cela changerait le propriétaire en www-data
, ce qui ouvre des failles de sécurité.
Le BIEN la solution serait :
sudo groupadd varwwwusers
sudo adduser www-data varwwwusers
sudo chgrp -R varwwwusers /var/www/
sudo chmod -R 760 /var/www/
Cela ajoute www-data
au varwwwusers
groupe, qui est ensuite défini comme groupe pour /var/www/
et tous ses sous-dossiers. chmod
donnera des autorisations de lecture, d'écriture et d'exécution au propriétaire, mais le groupe ne pourra exécuter aucun script potentiellement téléchargé si, par exemple, le serveur Web a été piraté.
Vous pouvez le définir sur 740
pour le rendre plus sûr, mais vous ne pourrez pas utiliser Django's
collectstatic
fonctionnalité donc respectez 760
sauf si vous êtes très sûr de ce que vous faites.