4
votes

Chargement des fichiers statiques Django 2.1 en production mais pas en développement

Habituellement, j'ai ce problème exactement dans l'autre sens!

Dans mon environnement de développement, mon application Django ne chargera pas certains de mes fichiers statiques, en particulier ceux que j'ai ajoutés moi-même: c'est-à-dire les deux packages que j'ai ajoutés à mon application ( admin et ckeditor ) se chargent tous les deux correctement, mais deux des dossiers que j'ai créés et liés moi-même ( img et css ) ne sont pas trouvés. Voici une carte de mon répertoire:

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('blog.urls')),
    path('admin/', admin.site.urls),
    path('ckeditor', include('ckeditor_uploader.urls')),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Comme indiqué, ckeditor et admin se chargent bien tandis que les autres ne le font pas. Voici un exemple de la sortie runserver en mode débogage (le fichier à static / css / base.css existe dans mon arborescence de fichiers):

DEBUG = True
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'ckeditor',
    'ckeditor_uploader',
]
...
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

Voici d'autres informations susceptibles de vous intéresser:

  • Cela fonctionne très bien en production! J'ai supposé que c'était parce que j'avais des alias dédiés dans ma configuration apache, mais cela n'explique pas pourquoi admin et ckeditor fonctionnent.
  • J'ai routé les médias de la même manière (voir le fichier de paramètres ci-dessous) et cela fonctionne bien en développement.
  • J'utilise la balise de modèle {% load static%} comme indiqué par la documentation Django. Dans les anciennes versions, j'utilisais {% load staticfiles%} et j'ai essayé cela aussi.
  • J'ai exécuté collectstatic dans les deux environnements.
  • L'exécution avec DEBUG = False fonctionne bien en production (tous les fichiers statiques se chargent) mais aucun fichier statique ne se charge lorsque DEBUG = False en développement. Il faut toutefois s'y attendre, car en développement, je n'ai pas de serveur Web pour gérer cela (pour clarifier, j'exécute généralement le serveur en mode débogage, mais j'ai essayé d'activer et de désactiver ce paramètre pour voir quels changements se produisent)

Pour aider quiconque à résoudre mon problème, voici quelques extraits de fichiers pertinents:

settings.py

GET /static/ckeditor/ckeditor/ckeditor.js HTTP/1.1" 200 690627
GET /static/admin/css/fonts.css HTTP/1.1" 200 423
GET /static/admin/css/widgets.css HTTP/1.1" 200 10340
GET /static/css/base.css HTTP/1.1" 404 1761
GET /static/img/brand.png HTTP/1.1" 404 1764


8 commentaires

Avez-vous exécuté collectstatic ?


@nik_m oui, dans les deux environnements - j'ajouterai cela à la question


dans votre urls.py le chemin de ckeditor n'a pas de / essayez de le donner et voyez.


Les fichiers statiques pour ckeditor sont déjà bien chargés dans les deux environnements. L'ajout du / semble n'avoir aucun effet, ni sur les fichiers statiques du ckeditor ni sur les fichiers statiques qui ne sont pas chargés.


ok, alors une autre suggestion pour la racine_statique et la racine_média, STATIC_ROOT = os.path.join (BASE_DIR, 'static /') et MEDIA_ROOT = os.path.join (BASE_DIR, 'media / ') essayez ceci.


Comme ci-dessus, cela n'a pas d'effet évident - en fait, les demandes faites au serveur sont identiques à celles faites avant le changement.


Quel est l'emplacement de votre fichier de paramètres?


@ 2ps settings.py est dans le dossier mysite . J'ai mis à jour la question pour refléter cela.


4 Réponses :


1
votes

Vos modèles d'url sont corrects, ce qui signifie que le problème est probablement lié à settings.DEBUG = False dans le fichier de paramètres. Assurez-vous que settings.DEBUG est True et que les fichiers statiques doivent se charger. Vous pouvez le vérifier en utilisant manage.py shell et en vérifiant la valeur de l'indicateur DEBUG .

Le seul autre problème à rechercher est de savoir si vous pointez vers le fichier URL correct dans vos paramètres en vérifiant le paramètre ROOT_URLCONF et si votre BASE_DIR pointe vers le répertoire parent du répertoire static . Les deux valeurs peuvent également être vérifiées dans shell.

Par exemple, si votre fichier de paramètres se trouve dans /path/to/root/blog/settings.py code>, puis vous définissez BASE_DIR comme:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


1 commentaires

Pardonnez-moi de ne pas être clair: bien que je dise que settings.DEBUG est False dans les informations supplémentaires, il est généralement défini sur True en développement . Dans le cas mentionné ci-dessus, j'ai essayé de le changer en False pour voir quel effet cela aurait, et le comportement était essentiellement comme prévu. Je ne manquerai pas de clarifier cela dans la question. Pour confirmer, j'ai vérifié le manage.py shell et j'ai également forcé une erreur 404 lors de l'exécution du serveur: les deux ont indiqué DEBUG = True . De plus, mon BASE_DIR est exactement le même que celui que vous suggérez - je vais m'assurer que la question le reflète également.



3
votes

Puisque vous avez 'django.contrib.staticfiles' dans votre liste d'applications, Django ne charge PAS les fichiers depuis STATIC_ROOT lorsque DEBUG est True.

Lorsque DEBUG est activé, Django utilise l'option STATICFILES_FINDERS qui par défaut est:

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'some_new_static_folder'),
]

FileSystemFinder trouvera les fichiers stockés dans le paramètre STATICFILES_DIRS et AppDirectoriesFinder recherche des fichiers dans un sous-répertoire static de chaque application.

C'est pourquoi les dossiers admin et ckeditor fonctionnent - Django n'utilise pas du tout votre dossier / root / static lorsque DEBUG est True. Au lieu de cela, il obtient des fichiers par AppDirectoriesFinder à partir des sous-répertoires static des applications. Quelque chose comme ... / 3.5 / lib / python3.5 / site-packages / django-ckeditor / static / ...

Lorsque vous exécutez la commande collectstatic , il collecte tous les éléments statiques fichiers que STATICFILES_FINDERS peut trouver et les copie dans votre STATIC_ROOT (/ root / static /) et si DEBUG est False Django utilise simplement ce dossier au lieu de STATICFILES_FINDERS

Alors, comment vous pouvez le faire fonctionner avec le débogage activé. Créez simplement un dossier et ajoutez-le à STATICFILES_DIRS comme ceci:

[
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

Vous pouvez également supprimer tous les fichiers de / root / static / que vous ne faites pas besoin de créer quelque chose dans ce dossier manuellement, collectstatic le fera automatiquement pour la production.


0 commentaires

1
votes

J'ai également eu des problèmes avec les fichiers locaux et cela m'aide dans ma situation.

Je stocke mes fichiers statiques sur S3 mais vous pouvez ajuster l'URL de l'emplacement de votre image.

if DEBUG == False:
    STATICFILES_LOCATION = 'static'
    STATIC_URL = "//%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
    MEDIAFILES_LOCATION = 'media'
    MEDIA_URL = "//%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
else:
    MEDIA_URL = '/media/'
    STATIC_URL = '/static/'


0 commentaires

6
votes

C'est une approche simple pour gérer les fichiers statiques dans django (qui fonctionne hors de la boîte si vous utilisez les options par défaut de Django):

  1. Ne mettez jamais rien vous-même dans le dossier que vous spécifiez comme STATIC_ROOT .
  2. Placez les fichiers statiques spécifiques à une application dans le dossier static de l'application.
  3. Pour les fichiers statiques qui n'appartiennent pas directement à une application, créez le dossier static_files dans votre projet et ajoutez à vos paramètres: STATICFILES_DIRS = [os.path.join (BASE_DIR, ' static_files '),] . Vous pouvez évidemment choisir un autre nom, static_files n'est qu'une suggestion.
  4. Pour la production exécutez collectstatic afin que Django collecte vos fichiers statiques (à partir des points 2. et 3.) et les place dans le dossier que vous avez créé en 1.

Si vous êtes en mode débogage, vous avez terminé après l'étape 3.


Dans votre cas , le problème était que vous mettiez du contenu statique dans STATIC_ROOT qui est un dossier que Django ne recherchera pas de contenu en mode débogage. admin et ckeditor fonctionnent car ils suivent l'étape 2., ainsi leurs fichiers statiques proviennent en fait du dossier de l'application installée et non de votre static dossier en mode débogage.


Alors, voici comment résoudre votre problème :

  • effectuez l'étape 3. ci-dessus.
  • déplacez vos dossiers img et css vers le dossier créé à l'étape 3.
  • (facultatif) effacez votre dossier STATIC_ROOT .

0 commentaires