2 votes

Django 2.2 : les fichiers statiques / médias ne s'affichent pas / ne sont pas traités

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 :

enter image description here

Voici à quoi ressemble le mien :

enter image description here

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 :

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 :

enter image description here

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.

1voto

IrrupTor Points 117

J'ai essayé de reproduire votre erreur :

Cela fonctionnait bien avec la configuration settings.py,

Mais comme j'ai ajouté la configuration de l'url statique dans urls.py, j'ai également reçu une erreur 404.

Je vous suggère de modifier urls.py comme suit :

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),

]

1voto

Angeles89 Points 448

J'ai tout compris.

Au bas de settings.py dans ma configuration originale, j'ai essayé d'importer des paramètres de production séparés avec ceci :

try:
    from .local_settings import *
except ImportError:
    pass

Prenez note de la période qui précède local_settings . Cela renvoie au fichier caché .local_settings.py dans le même répertoire. Dans ma configuration actuelle, mon fichier de paramètres de production n'était pas réellement caché. Mes paramètres de production existaient simplement dans le répertoire du projet sous le nom de local_settings.py. Il n'y avait en fait aucun préfixe de période. Étant donné que mes paramètres de production n'étaient pas référencés correctement, c'était mon problème.

J'aurais vraiment dû inclure les détails de mon fichier de configuration des paramètres de production dans ma question initiale. Je ne sais pas comment j'ai pu manquer cela.

Ma production DEBUG Le paramètre de la variable a été réglé sur False Pourtant, mon environnement Django live affichait toujours des informations de débogage dans mon navigateur web lorsque je tentais de lancer mon serveur. Cela aurait dû me mettre la puce à l'oreille, mais j'ai manqué cela le week-end dernier lorsque j'ai assemblé cette question sur Stack Overflow pour la première fois.

Pour l'instant, j'ai réussi à faire fonctionner le serveur et à analyser correctement les fichiers statiques et multimédia, mais avec des changements dans mon fichier settings.py original. Donc je n'appelle toujours pas local_settings.py correctement. Je vais écrire une question séparée sur la façon d'invoquer correctement les paramètres de production plus tard.

Voici les modifications temporaires que j'ai apportées au primaire settings.py ce qui fonctionne pour moi maintenant :

  1. ALLOWED_HOSTS comprend l'adresse IP de mon serveur.
  2. Mon dictionnaire DATABASES fait référence à la configuration de base de test SQLite au lieu de la configuration plus avancée PostgreSQL.
  3. Au lieu que STATIC_ROOT soit réglé sur os.path.join(BASE_DIR, 'static') Je l'ai réglé sur os.path.join(os.path.dirname(BASE_DIR), "static")

J'ai également modifié l'appel à la fonction statique urlpatterns pour inclure ceci : + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) . Cependant, que je commente ou non cette ligne, le serveur semble continuer à analyser les fichiers statiques et multimédia sans problème.

0voto

domeafavor Points 1

Non, .local_settings ne signifie pas que vous devez avoir un fichier '.local_settings.py'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X