J'essaie de déployer le projet "immobilier" de mon instructeur Django (Udemy). Voici les grandes lignes de Brad Traversy .
Sur mon VPS, j'utilise Ubuntu 18.04, Python 3.6.8 et Django 2.2.4.
J'ai suivi le guide de Brad pour le déploiement de Django. J'ai réussi à le faire fonctionner mais les fichiers statiques (CSS, JS et images) ne sont pas servis. C'est un problème de configuration et je ne vois pas très bien ce que je fais de mal ou ce qui me manque.
Voici à quoi devrait ressembler le résultat final :
Voici à quoi ressemble le mien :
En explorant d'autres questions et réponses sur SO, dans mon settings.py, j'ai essayé d'insérer (et de retirer) différents chemins dans STATIC_ROOT, MEDIA_ROOT, STATICFILES_DIRS en utilisant la méthode join. J'ai également essayé d'ajouter un certain nombre d'éléments de liste différents dans la variable urlpatterns dans urls.py. Après avoir essayé chaque nouveau changement potentiel, j'entre python manage.py collectstatic
et ensuite je lance le serveur. Parfois, il y a un retour de trace qui empêche le serveur de fonctionner. Dans ce cas, j'ai simplement annulé la modification pour revenir à un paramètre connu pour fonctionner, ou bien j'ai essayé quelque chose d'entièrement différent qui a permis au serveur de fonctionner sans retour de trace.
Conformément à la réponse de @IrrupTor, lorsque j'exécute ce projet localement, les fichiers statiques et médias sont parfaitement analysés. Cela confirme donc que le problème existe dans ma configuration distante sur mon VPS. Quelles autres informations pourrais-je fournir pour mieux expliquer pourquoi les fichiers statiques et multimédia ne se chargent pas sur mon VPS ?
Voici d'autres questions sur le SO que j'ai déjà utilisées :
- Django 2.2 ne sert pas les fichiers statiques
- Les fichiers statiques ne s'affichent pas en production
- Django : Les fichiers statiques ne s'affichent pas sur le serveur de déploiement
Voici la sortie dans mon shell Django :
python manage.py runserver 0.0.0.0:8000
Performing system checks...
System check identified no issues (0 silenced).
September 14, 2019 - 00:44:11
Django version 2.2.4, using settings 'btre.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
[14/Sep/2019 00:44:15] "GET / HTTP/1.1" 200 13775
[14/Sep/2019 00:44:15] "GET /static/css/bootstrap.css HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/css/all.css HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/css/style.css HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/css/lightbox.min.css HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/js/jquery-3.3.1.min.js HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/img/logo.png HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/js/lightbox.min.js HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/js/bootstrap.bundle.min.js HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/js/main.js HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/js/lightbox.min.js HTTP/1.1" 404 77
[14/Sep/2019 00:44:15] "GET /static/js/main.js HTTP/1.1" 404 77
Voici mon urls.py :
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('', include('pages.urls')),
path('listings/', include('listings.urls')),
path('accounts/', include('accounts.urls')),
path('contacts/', include('contacts.urls')),
path('admin/', admin.site.urls),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Voici les lignes pertinentes dans mon settings.py :
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static")
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'btre/static')
]
# Media Folder Settings
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
Voici l'arborescence de mes fichiers :
Voici mon dépôt de code source (forké) sur GitHub .
Une dernière remarque : pour l'instant, j'utilise le serveur de test de Django sur mon VPS. Je suis conscient que ce n'est pas une bonne pratique car ce n'est pas sécurisé. Je déploie simplement le serveur intégré de Django comme un tremplin. Une fois les fichiers statiques et multimédia chargés, je passerai rapidement à nginx et gunicorn, comme décrit dans le guide original.