La soluzione per questo problema quando si ha a che fare con il server di produzione sarebbe quella di utilizzare collectstatic come già accennato che ha utilizzato e risolto o concedere autorizzazioni alle cartelle. Tuttavia, se la tua soluzione si trova in un ambiente locale, la soluzione può essere acquisita configurando il MEDIA
locale directory in settings.py
file che agisce sul server locale.
Quindi, aggiungerei queste due righe nel file di configurazione locale come menzionato da @Nic Scozzaro:
MEDIA_ROOT = os.path.join (BASE_DIR, 'media')
STATIC_ROOT = os.path.join (BASE_DIR, 'static')
Dopo la configurazione riavviare i servizi per applicare le correzioni.
Crea una directory 'MEDIA' nella root del tuo progetto.Quindi imposta:
MEDIA_ROOT = os.path.join(BASE_DIR,'MEDIA')
Per sapere con quale utente sei connesso:
$ whoami
ubuntu
E aggiungendo alla tua soluzione, se stai utilizzando un'istanza AWS, dovresti aggiungere il tuo utente al gruppo per poter accedere a quella cartella:
Creare un gruppo per gli utenti dei servizi web (varwwwusers)
$ sudo groupadd varwwwusers
Cambia la cartella www e falla appartenere a varwwwusers
$ sudo chgrp -R varwwwusers /var/www/
www-data è il server che effettua le richieste Django, aggiungilo al gruppo
$ sudo adduser www-data varwwwusers
Cambia criterio cartella
$ sudo chmod -R 770 /var/www/
Aggiungi Ubuntu al gruppo di varwwwusers
$ usermod -a -G varwwwusers ubuntu
Spero che questo aiuti!
Alla fine ho risolto da solo.
Durante l'esecuzione sulle macchine di sviluppo, in effetti sto utilizzando i privilegi del mio attuale utente. Tuttavia, durante l'esecuzione sul server di distribuzione, in realtà sto eseguendo wsgi
, il che significa che è in esecuzione utilizzando www-data
privilegi di.
www-data
non è né il proprietario né il gruppo di utenti che possiede /var/www
. Ciò significa che www-data
viene trattato come other
e ha i permessi impostati su altri.
Il Cattivo la soluzione a questo sarebbe fare:
sudo chmod -R 777 /var/www/
Questo darebbe a tutti pieno accesso a tutto in /var/www/
, che è una pessima idea.
Un altro BATTITO la soluzione sarebbe fare:
sudo chown -R www-data /var/www/
Questo cambierebbe il proprietario in www-data
, che apre vulnerabilità di sicurezza.
Il BUONO la soluzione sarebbe:
sudo groupadd varwwwusers
sudo adduser www-data varwwwusers
sudo chgrp -R varwwwusers /var/www/
sudo chmod -R 760 /var/www/
Questo aggiunge www-data
al varwwwusers
group, che viene quindi impostato come gruppo per /var/www/
e tutte le sue sottocartelle. chmod
darà i permessi di lettura, scrittura, esecuzione al proprietario ma il gruppo non sarà in grado di eseguire alcuno script potenzialmente caricato lì se, ad esempio, il server web è stato violato.
Potresti impostarlo su 740
per renderlo più sicuro, ma non sarai in grado di utilizzare Django's
collectstatic
funzionalità quindi attieniti a 760
a meno che tu non sia molto sicuro di quello che stai facendo.