[Django] Une collection de scripts pratiques pour le développement

Dans le développement Django, vous avez tendance à frapper cli, J'utilise souvent des fonctions d'exécution de tâches telles que Pipenv parce que je ne me souviens pas des options et que c'est gênant. J'utilise beaucoup les scripts de poésie parce que je suis une secte de «poésie». (Notez que la poésie n'implémente pas la fonction scripts dans le nom de la fonction d'exécution de tâches)

De plus, si vous utilisez django_extensions, vous pouvez souvent déjà utiliser les fonctions que vous souhaitez.

Dans un post précédent, j'ai présenté un script qui fait runserver. [Poetry] Démarrez le serveur d'exécution de Django avec le script Poetry --Qiita En plus de cela, je présenterai cette fois le script utilisé dans mon projet.

environnement

django-extensions

django-extensions est une application pour le développement Django et est un paquet qui fournit diverses fonctions utiles. Installez django-extensions et ajoutez-le à INSTALLED_APPS.

$ pip install django-extensions
INSTALLED_APPS = [
    ...
    'django_extensions', #ajouter à
]

scripts

J'utilise Poetry pour la gestion des paquets, donc j'utilise des scripts de poésie. L'avantage d'utiliser des scripts de poésie est que même si vous l'exécutez en dehors de l'environnement virtuel, il entrera une fois dans l'environnement virtuel et exécutera la tâche dans l'environnement virtuel. Si vous souhaitez vérifier uniquement le test, lister uniquement l'URL ou même si vous ne comprenez pas l'environnement virtuel, vous pouvez l'exécuter avec une commande sur une seule ligne.

Comme dans l'article précédent, nous utiliserons le package de sous-processus pour exécuter des commandes.

shell_plus

C'est une fonction appelée django-extensions, et il existe une fonction appelée shell_plus. Il étend le shell Django et est assez pratique car il complète et pré-importe.

def shell_plus():
    cmd = ["python", "manage.py", "shell_plus"]
    subprocess.run(cmd)

Afficher l'URL

django-extensions a la capacité de générer toutes les URL des applications Django. C'est très utile lors de la création de documents API. L'option --format vous permet de changer le format de sortie.

def url():
    cmd = ["python", "manage.py", "show_urls", "--format", "aligned", "--force-color"]
    subprocess.run(cmd)

Afficher TODO dans la source

Si vous utilisez la fonction notes de django-extensions, Il extrait TODO, FIXME, BUG, HACK, WARNING, NOTE, etc. dans le fichier py et le fichier HTML et les affiche dans une liste. C'est sobre et pratique, et il est bon de pouvoir confirmer le TODO en début de journée avec la CLI. Le chemin du fichier est également affiché, donc s'il s'agit de VS Code, vous pouvez l'ouvrir tel quel avec Ctrl + clic.

def todo():
    cmd = ["python", "manage.py", "notes"]
    subprocess.run(cmd)

--Production

$ python manage.py notes
/home/user/workspace/app/web/views.py:
  * [ 18] TODO  sort filter

/home/user/workspace/app/web/models.py:
  * [ 11]Gestion des exceptions TODO

/home/user/workspace/app/web/forms.py:
  * [ 32]Ajout de la validation TODO

Lancer le test

La fonction de test de Django comprend une fonction d'exécution parallèle. Bien entendu, le nombre de cœurs CPU est lié au nombre d'exécutions, mais le nombre de cœurs varie en fonction de l'environnement. Utilisez multiprocessing.cpu_count () pour acquérir dynamiquement le nombre de cœurs et exécuter des tests en parallèle. -v est verbeux.

import multiprocessing

def test():
    core_num = multiprocessing.cpu_count()
    # core_Si vous le définissez sur num, le test ne fonctionnera pas car le sous-processus sera un processus d'exécution.
    cmd = ["python", "manage.py", "test", "--force-color", "-v", "2", "--parallel", f"{core_num - 1}"]
    subprocess.run(cmd)

Supprimer le fichier de migration

Lorsque la base de données est réinitialisée, tous les fichiers de migration sont supprimés. Il est facile de créer un script de suppression car cela se fait assez souvent au tout début du développement.

import os
import glob

BASE_DIR = os.path.dirname(os.path.dirname(__file__)) #Modifié par l'emplacement de ce fichier

def clean_migration():
    migration_files = glob.iglob('**/migrations/[0-9][0-9][0-9][0-9]*.py', recursive=True)
    for migration_file in migration_files:
        os.remove(os.path.join(BASE_DIR, migration_file))
        print(f"Deleted {migration_file}")

Réinitialisation de la base de données

La possibilité de supprimer et de recréer la base de données avec une seule commande est fournie dans django-extensions.

def reset_db():
    cmd = ["python", "manage.py", "reset_db"]
    subprocess.run(cmd)

Génération de diagramme ER

Si vous utilisez la fonction de django-extensions, le diagramme ER sera automatiquement généré à partir de la définition du modèle. Pour utiliser cette fonctionnalité, vous avez besoin de Graphviz et de l'adaptateur pour Pythonpygraphviz, C'est génial de créer le dernier diagramme ER avec une seule commande.

def graph():
    cmd = ["python", "manage.py", "graph_models", "-a", "-g", "-o",  "--arrow-shape", "normal", "graph.png "]
    subprocess.run(cmd)

Affichez le nom de l'application avec models.py

Affiche le nom de l'application où models.py existe. Ce n'est pas beaucoup de code, mais c'est utile lors de la vérification lors des migrations. Si vous avez une structure de répertoires qui dit python manage.py startapp app et que vous n'écrivez pas de modèle, vous devez supprimer models.py.

import glob

def main():
    model_files = glob.iglob('**/models.py', recursive=True)

    for model_file in model_files:
        path_split = model_file.split("/")
        print(path_split[-2])

En plus de ceux-ci, il y a runserver_plus qui améliore django runserver, ʻadmin_generator` qui génère automatiquement admin.py, etc., mais ils ne sont pas listés car je ne les ai jamais utilisés moi-même.

Recommended Posts

[Django] Une collection de scripts pratiques pour le développement
Résumé du livre électronique Python utile pour l'analyse de données gratuite
Collection de conseils Numpy, Pandas souvent utilisés sur le terrain
[Linux] Liste de sélection d'origine des commandes pratique mais inconnue de manière inattendue
Une collection de ressources qui peuvent être utiles pour créer et développer des fichiers dotfiles
Super simple: une collection de shells qui produisent des dates
J'ai créé un environnement de développement pour Django 3.0 avec Docker, Docker-compose, Poetry
[DynamoDB] [Docker] Créer un environnement de développement pour DynamoDB et Django avec docker-compose
Une collection de serveurs Web à une seule ligne
Implémentez votre propre commande magique jupyter% timeit, pratique pour la mesure de vitesse, en Python
Mémorandum de notation de schéma JSON pour les dictionnaires qui prennent des clés arbitraires
[Django] Une collection de scripts pratiques pour le développement
Une collection de méthodes utilisées lors de l'agrégation de données avec des pandas
Aiguille en or pour quand elle devient une pierre en regardant la formule du traitement d'image
Une collection de conseils pour accélérer l'apprentissage et le raisonnement avec PyTorch
Sites utiles pour étudier Django
Créez un modèle pour votre planning Django
Commandes pour créer un nouveau projet django
Impressions d'utilisation de Flask pendant un mois
Construction d'un environnement de développement pour l'atelier Choreonoid
Créer un environnement de développement Python pour le développement de l'IA
Créer un environnement de développement pour l'apprentissage automatique
Ecrire brièvement if-else du template Django
Pour les débutants de SageMaker - Liens matériels -
Classe pour PYTHON qui peut être utilisée sans connaître LDAP
L'histoire de Django créant une bibliothèque qui pourrait être un peu plus utile
Affichons un template simple idéal pour le premier Django