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.
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.
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
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.
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.
J'ai pu me connecter.
Cliquez sur Messages. É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. 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. 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.
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()
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?)
Recommended Posts