[PYTHON] Une série d'ingénieurs d'infrastructure amateurs touchant Django avec Docker ③: administrateur Django

TL;DR Poursuite de Ingénieur infrastructure amateur touchant Django avec Docker (2): Création d'un modèle. Si vous voulez lire à partir de 1, ↓ ici. Ingénieur d'infrastructure amateur touche Django avec Docker (1): Make Django avec Docker Cette fois aussi, je jouerai avec django tout en faisant un échantillon de Django Girls. Depuis que j'ai créé un modèle la dernière fois, j'aimerais utiliser View et Template cette fois, mais j'apprendrai d'abord le site d'administration (admin) pour gérer les modèles Django. Afin d'exécuter jusqu'à la création utilisateur du site de gestion avec docker-compose, il est nécessaire de créer une commande étendue afin que la commande de création createuperuser puisse être exécutée avec une seule ligne, ce qui est également décrit.

Django admin Django a une page appelée admin par défaut pour gérer le modèle créé avec l'interface graphique. Cette fois, nous examinerons son activation et son utilisation.

① Modifier admin.py

admin.py Modifiez comme suit.

blog/admin.py


from django.contrib import admin
from .models import Post

admin.site.register(Post)

Puisque la première ligne est incluse depuis le début, les autres lignes sont ajoutées.

Commentaire bien compris

from django.contrib import admin

Le module d'application du site d'administration. Bien que je ne l'ai pas mentionné la dernière fois, django.contrib.admin est également répertorié par défaut dans INSTALLED_APPS dans settings.py où j'ai ajouté l'application que j'ai créée, afin qu'elle puisse être utilisée depuis le début. Il est devenu.

from .models import Post

Le modèle Post est appelé depuis models.py stocké dans le même répertoire.

admin.site.register(Post)

Vous pouvez ajouter un modèle sous le contrôle du site d'administration avec ʻadmin.site.register (Model) `.

Jetons maintenant un œil au site d'administration dans le conteneur en cours d'exécution. (Docker-compose up n'a pas besoin d'être démarré depuis la dernière fois.)

docker-compose up

Ce qui suit est exécuté à partir d'un autre terminal. La dernière fois, j'ai exécuté python manage.py migrate blog pour migrer uniquement les migrations sous le répertoire du blog, mais cette fois, je migre également le modèle d'administration en l'exécutant sans donner d'argument.

docker-compose exec web bash
python manage.py migrate
exit

Accédez à http: // IPADDRESS: 8000 / admin 001.png L'écran de connexion s'ouvre. L'utilisateur de connexion à entrer ici doit être créé en exécutant la commande avec migrate.py de la même manière que la migration de base de données.

② Créez un super utilisateur pour le site d'administration

docker-compose exec web bash
python manage.py createsuperuser
exit

Lorsque j'exécute createuperuser, j'obtiens une invite. Lorsque vous entrez le nom d'utilisateur, l'adresse e-mail et le mot de passe, le résultat "Super-utilisateur a été créé avec succès." "Sera affiché. Entrez les informations saisies ici sur l'écran de connexion.

002.png J'ai pu me connecter.

③ Opération d'enregistrement

Cliquez sur Messages. 003.png Étant donné que le modèle POST a été défini la dernière fois et que le tableau a été créé, il est naturellement affiché comme 0 messages. Il semble que vous puissiez insérer des données avec le bouton appelé ADD POST, essayez donc d'appuyer dessus. 004.png Comme défini dans models.py la dernière fois, il y a des zones de texte et des listes déroulantes pour l'entrée. J'en publierai un comme essai. 005.png J'ai pu ajouter les données en toute sécurité. Allez dans le conteneur db et voyez s'il contient réellement l'enregistrement.

docker-compose exec db bash
psql -U postgres
SELECT * FROM blog_post;

SELECT résultat de l'exécution


 id | title |        text        |      created_date      |     published_date     | author_id
----+-------+--------------------+------------------------+------------------------+-----------
  1 | TEST  | This is test post. | 2020-05-02 07:47:14+00 | 2020-05-02 07:47:26+00 |         2
(1 row)

J'ai pu confirmer que les enregistrements étaient correctement conservés. Vous pouvez créer, mettre à jour et supprimer des enregistrements sur le même écran.

Créer un docker-compose qui inclut la migration de la base de données et créer un traitement de superutilisateur

Jusqu'à présent, je me suis connecté au conteneur en utilisant docker-compose exec à des fins de vérification uniquement, mais si possible, il serait plus intelligent de construire jusqu'à ce point avec docker-compose up à la fois.

①DB migrate En ce qui concerne migrate, il vous suffit de taper une commande, vous pouvez donc la traiter en réécrivant command: dans docker-compose.yaml comme indiqué ci-dessous. (Make migration crée uniquement un fichier de migration, vous n'en avez donc pas besoin si vous en avez déjà un.)

docker-compose.yaml


command: sh -c "sleep 5; python manage.py migrate; python manage.py runserver 0.0.0.0:8000"

J'ai dormi 5 secondes avant d'exécuter migrate, mais je l'ai ajouté car une erreur se produit parfois en raison d'un problème de synchronisation de démarrage de Postgres.

②createsuperuser Puisque createuperuser traite de manière interactive au moment de l'exécution, docker-compose ne peut pas le gérer à moins qu'il ne puisse être exécuté avec une seule doublure. Quand je googlé, manage.py semble être capable d'étendre les commandes en créant un dossier appelé management / commandes et en ajoutant un fichier python. https://stackoverflow.com/questions/6244382/how-to-automate-createsuperuser-on-django https://docs.djangoproject.com/en/1.8/howto/custom-management-commands/ Utilisez-le pour éventuellement recevoir un nom d'utilisateur et un mot de passe pour créer une commande personnalisée à une ligne.

cd blog
mkdir -p management/commands
touch management/__init__.py
touch management/commands/__init__.py

createcustomsuperuser.py

management/commands/createcustomsuperuser.py


from django.contrib.auth.management.commands import createsuperuser
from django.core.management import CommandError


class Command(createsuperuser.Command):
    help = 'Crate a superuser, and allow password to be provided'

    def add_arguments(self, parser):
        super().add_arguments(parser)
        parser.add_argument(
            '--password', dest='password', default=None,
            help='Specifies the password for the superuser.',
        )

    def handle(self, *args, **options):
        password = options.get('password')
        username = options.get('username')
        database = options.get('database')

        if password and not username:
            raise CommandError("--username is required if specifying --password")

        super().handle(*args, **options)

        if password:
            user = self.UserModel._default_manager.db_manager(database).get(username=username)
            user.set_password(password)
            user.save()

Commentaire bien compris

from django.contrib.auth.management.commands import createsuperuser

Cette fois, importez pour étendre la commande de createuperuser.

from django.core.management import CommandError

Erreur de commande de django. Cette fois, il est utilisé pour renvoyer une erreur lorsqu'il n'y a pas assez d'arguments.

class Command(createsuperuser.Command):
    help = 'Crate a superuser, and allow password to be provided'

Ajout du libellé affiché lors de l'appel de l'aide avec --help ou -h.

    def add_arguments(self, parser):
        super().add_arguments(parser)
        parser.add_argument(
            '--password', dest='password', default=None,
            help='Specifies the password for the superuser.',
        )

Une fonction qui ajoute des arguments de commande. super (). Add_arguments (parser) est en cours d'exécution pour ajouter également l'argument de createuperuser d'origine. Ajout d'un argument appelé mot de passe qui n'a pas été accepté par le createuperuser d'origine.

    def handle(self, *args, **options):
        password = options.get('password')
        username = options.get('username')
        database = options.get('database')

        if password and not username:
            raise CommandError("--username is required if specifying --password")

        super().handle(*args, **options)

        if password:
            user = self.UserModel._default_manager.db_manager(database).get(username=username)
            user.set_password(password)
            user.save()

La partie de traitement proprement dite. L'utilisateur créé par le processus conventionnel createuperuser est recherché à partir de la base de données et le mot de passe est défini et enregistré.

Après avoir créé ce fichier, réécrivez docker-compose.yaml comme suit.

docker-compose.yaml


    command: sh -c "sleep 5; python manage.py migrate; python manage.py createcustomsuperuser --username root --password 123456 --noinput --email '[email protected]'; python manage.py runserver 0.0.0.0:8000"

(Le mot de passe est un exemple) De cette façon, pouvoir écrire dans docker-compose.yaml semble être une bonne chose si vous le spécifiez dans Secret dans le manifeste, même lors de la migration vers Kubernetes.

Veuillez vous assurer que le processus jusqu'à ce point est terminé en une seule ligne, docker-compose up.

docker-compose up

La prochaine fois, j'apprendrai à écrire urls.py. (Quand allez-vous écrire une vue?)

Suite

Recommended Posts

Une série d'ingénieurs d'infrastructure amateurs touchant Django avec Docker ③: administrateur Django
Une série d'ingénieurs d'infrastructure amateurs touchant Django avec Docker (2): création d'un modèle
Une série d'ingénieurs d'infrastructure amateurs touchant Django avec Docker ⑤: View, Template, CSS
Déployer l'application Django avec Docker
[Python] Créer un environnement de développement Django avec Docker
Impressions de toucher Django
Un mémo sur la création d'une application Django (Python) avec Docker
Lancer Django sur un conteneur Docker à l'aide de docker-compose up
Créez un environnement de développement avec Poetry Django Docker Pycharm
[Memo] Construire un environnement de développement pour Django + Nuxt.js avec Docker
Je veux créer un éditeur de blog avec l'administrateur de django
[Django] Créez rapidement un environnement de développement de conteneur Django (Docker) avec PyCharm
Créer une application Todo avec Django ① Créer un environnement avec Docker
Créer une page d'accueil avec django
J'ai essayé de résumer brièvement la procédure de démarrage du développement de Django
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
Créer un serveur Flask avec Docker
Créer un fichier deb avec Docker
Django Tips-Créez un site de classement avec Django-
Créer une application Web avec Django
Créer un filtre avec un modèle django
Principes de base pour toucher MongoDB avec MongoEngine
Créer un téléchargeur de fichiers avec Django