[PYTHON] Ne lisez pas la documentation officielle tant que je n'ai pas compris les fichiers statiques de Django

Ceci est l'article sur le 11e jour du calendrier de l'Avent.

introduction

Week-end / minuit Pythonista. Je suis une personne qui joue avec les pandas, les numpy et les scipy lors de la compilation de données au travail. Je suis souvent tombé sur des fichiers statiques lors de l'utilisation de Django comme passe-temps, je voudrais donc résumer les points d'achoppement et les solutions pour "les gens qui ne comprennent pas ce qu'ils ne comprennent pas". Je vous serais reconnaissant si vous pouviez signaler des erreurs.

~~ Parce que le Document officiel est incroyablement gentil quand je suis fou Si vous le lisez attentivement, le comprenez et bougez votre main tel quel, vous le comprendrez sûrement. ~~

Q1: Qu'est-ce qu'un fichier statique en premier lieu?

Fichier statique? : en pensant: Qu'est-ce qu'un fichier qui ne fonctionne pas ...?

A1: ** Voyons comment fonctionne le Web. ** **

~~ Lisons le document officiel ~~ En gros, c'est CSS, JS, etc. Un fichier fourni côté client sans aucune modification du serveur au contenu dynamique généré par Django.

Fonctionnement du serveur Web: Référence MDN (https://developer.mozilla.org/ja/docs/Learn/Common_questions/What_is_a_web_server)

Le terme fichier statique lui-même semble être la propre phrase de Django (?), Mais je pense qu'il peut être compris sans difficulté si vous comprenez comment fonctionne l'application web.

Si vous ne comprenez pas cela (votre moi passé), étudions le fonctionnement du Web.

Gérer les fichiers statiques (images, JavaScript, CSS, etc.) ¶ Les sites Web doivent généralement fournir des fichiers supplémentaires tels que des images, JavaScript et CSS. Dans Django, ces fichiers sont appelés "fichiers statiques". Pour faciliter la gestion des fichiers statiques, Django fournit django.contrib.staticfiles. (Documentation officielle de Django)

Il est correctement écrit dans le document officiel. .. ..

Q2: Où est la bonne réponse après tout?

Le tutoriel qui accompagne la documentation officielle de Django, le DjangoGirlsTutorial (le célèbre tutoriel de Django), vous présente à creuser un répertoire statique dans votre application.

Créez un répertoire statique dans le répertoire polls. Django y recherche des fichiers statiques.

(Documentation officielle de Django)

Étant donné que les sondages ci-dessus sont le nom de l'application, nous vous demandons de créer un répertoire dans l'application.

Où les fichiers statiques doivent-ils être placés dans le projet? Django sait où chercher les fichiers statiques grâce à son application "admin" intégrée. Tout ce que nous avons à faire est d'ajouter un fichier statique pour l'application de blog.

Pour cela, créez un dossier appelé statique dans l'application du blog

djangogirls ├── blog │ ├── migrations │ ├── static │ └── templates └── mysite (DjangoGirlsTutorial)

Cela crée également un répertoire dans l'application.

D'autre part, les meilleures pratiques recommandent de placer un dossier statique directement sous le projet.

A2: l'un ou l'autre va bien

En effet, même lors de la création d'un répertoire statique dans une application, l'espace de noms est généralement utilisé avec la configuration suivante. (* Je vais présenter le mauvais cas lorsque vous n'utilisez pas l'espace de noms dans l'édition supplémentaire) Pour le dire franchement, il est difficile de voir personnellement s'il est dispersé, c'est donc une bonne idée de suivre les meilleures pratiques. Évitez de l'utiliser ensemble.

(nom de l'application) 
 ┣static
     └ (nom de l'application)
           ┣css
           ┣js

Q3: Le problème que l'environnement de production css ne frappe pas

Je pense que c'est un fichier statique qui brise le cœur de quiconque tente de déployer une application Django. .. ..

A3: Passons en revue les paramètres du serveur Web

Je pense que le côté serveur Web est souvent chargé de fournir des fichiers statiques dans l'environnement de production. Les fichiers statiques sont-ils au même endroit? Assurez-vous que les paramètres de livraison sont corrects.

Du côté de Django, tout ce que vous devez faire attention est de savoir si vous avez des fichiers statiques au même endroit. La commande pour combiner les fichiers statiques en un seul endroit est python manage.py collect static.

Lorsque vous appuyez sur cette commande, les fichiers statiques visibles depuis django.contrib.staticfiles sous l'environnement de développement seront collectés dans le jeu STATIC_ROOT dans settings.py.

De plus, si vous avez déjà un fichier avec le même nom, il vérifiera l'horodatage et en enregistrera un nouveau! Cela facilitera la configuration de choses comme Nginx.

La documentation officielle autour de cette commande collectstatic n'a pas été traduite en japonais et reste en anglais, ce qui peut faire partie de la lecture diagonale de la documentation officielle. .. ..

Extra: Conflit de fichier statique

Lors de la création d'un répertoire statique dans votre application, faites attention aux conflits de noms de fichiers statiques. Si un fichier statique du même nom existe dans Django, seul le fichier qui a été recherché en premier sera fourni.

S'il existe un fichier statique avec le même nom comme indiqué ci-dessous, Django ne sait pas quel fichier statique doit être fourni. Dans ce cas, le ** premier ** css trouvé par saticfiles sera deviné.

project_root/app1/static/main.css


h1{
  color: blue;
}

project_root/app2/static/main.css


h1{
  color: red;
}

Donc, même si vous essayez d'appeler main.css dans chaque modèle comme ci-dessous ...

project_root/app1/templates/app1.html


{% load static %}
<link rel="stylesheet" href="{% static "main.css" %}">
{% static "main.css" %}  <!--Pour le débogage-->
<h1>App1.html<h1>

project_root/app2/templates/app2.html


{% load static %}
<link rel="stylesheet" href="{% static "main.css" %}">
{% static "main.css" %}  <!--Pour le débogage-->
<h1>App2.html<h1>

Comme vous pouvez le voir, un seul CSS est touché. Je voulais que App1 ait un texte bleu et App2 un texte rouge, mais les deux sont devenus bleus. app1_app2.PNG

Dans un tel cas, appuyez sur la commande find static. Vous pouvez utiliser cette commande pour connaître l'ordre de recherche de Django.

$ python manage.py findstatic main.css
Found 'main.css' here:
  C:\Users\Cuz\Desktop\Projects\static_files_sample\app1\static\main.css
  C:\Users\Cuz\Desktop\Projects\static_files_sample\app2\static\main.css

À ce stade, vous pouvez voir que le css de app1 ci-dessus frappe et que le css de app2 ne frappe pas.

Ceci est également décrit dans les Documents officiels

Résumé

Lisez la documentation officielle! Lisons! Non, lisez-le! C'est tout. .. .. Si vous le relisez, il sera écrit avec de très petits détails, il est donc recommandé de le lire attentivement d'un coin à l'autre.

(Je n'ai pas eu assez de temps pour les fichiers multimédias liés et le déploiement ... je l'écrirai systématiquement l'année prochaine!)

Demain, c'est "L'histoire de la bibliothèque utilisée dans le développement" de @ skd_nw! Je vous remercie!

Recommended Posts

Ne lisez pas la documentation officielle tant que je n'ai pas compris les fichiers statiques de Django
Je ne comprends pas rejoindre
[Django] Je n'ai pas bien compris ce qu'est la méthode inverse, alors lisez le document officiel.
J'ai lu l'article de SHAP
sphinx-Read the Docs intégration pour apidoc
Je ne connais pas l'erreur de valeur