# Liens vers les cours:
Nouveau django3 Commencez à travailler sur le projet(Zero Basicsdjango、Pratiques de développement de projets、Tous les plans de fin d'études universitaires sont disponibles)_Bip, bip, bip_bilibili
# Couverture des cours:
Module administrateur_(4-7 ~~~ 4-10 Cours)
# (1)Page de connexion
1)Page d'atterrissage ici directement bootstrap Il suffit de tirer un modèle de connexion sur le site officiel de.C'est ce qui se passe.(Bien sûr que non.,J'ai changé ça.).Plus précisément html Le Code n'est pas donné,C'est simple..Donc nous avons ajouté Correspondant admin/login Fonction de routage pour.Passe. render La demande est prête à voir la page.
2) Parce que cette utilisation secondaire forms Fais - le., Alors commençons par examiner forms .Comme le montre la figure ci - dessous. On peut voir le substituant placeholder Pas assez intelligent,Pour résoudre ce problème, Nous utilisons les paquets précédents bootstrap Code à faire .
En bas, c'était avant bootstrap Code détaillé pour,Nous pouvons voir,C'est hérité de forms.modelform C'est écrit, Mais pour notre mission , Vous devez écrire un autre héritage de forms.Form De bootstrap Code. Cependant, cela crée une redondance de code .
La solution à la redondance de code est simple , Parce qu'il y a deux classes au - dessus de nous , Le même Code est utilisé , Mais les parents hérités sont différents , Donc nous pouvons encapsuler une classe générale , Voici le Code partagé . Puis écrivez deux autres classes , Hérite de la classe totale ci - dessus et de leurs parents respectifs .Comme ça.Comme le code ci - dessous
Alors, quand on les réutilisera, , Il suffit d'utiliser notre fonction de routage actuelle Form ToujoursModelForm De la sélection correspondant à bootstrap Le plug - in de style est juste .L'image suivante montre, Nous héritons directement du bootstrap Plug - in, Parce que ma porte utilise Form ,Donc nous importons BootStrapForm
3)Ajouter un message d'erreur.À l'avant html Dans la page,Nous ajoutons un span L'étiquette contient ce message d'erreur { { field.errors.0}} ,En fait... field.errors Ça devrait être un objet , Il contient plusieurs messages d'erreur , On a juste utilisé le premier . Bien sûr, avant utilisation , Nous devons également désactiver la vérification du Navigateur ,C'est - à - dire dans form Dans le formulaire novalidate.
Et donc,, Dans la fonction de routage à l'arrière - plan ,Nous entrons directement dans post Demande, Alors nous instancions LoginForm(data=request.POST) Après, Ce que vous obtenez est l'information que vous entrez , Ici, que l'entrée soit vide ou non . La vérification des données est alors effectuée ,Si vide, Nous retournons toujours à la page de connexion , Et renvoie un message d'erreur form . Apparemment, si ce n'est pas vide , Alors nous jugeons l'information saisie (C'est - à - direform.cleaned_data)Dans la base de données,Si ce n'est pas le cas,Donc la valeur de retour admin_info Pour None ,Comme ça.,On peut utiliser form Personnaliser ajouter un message d'erreur , Pour ajouter un message d'erreur . C'est - à - dire la Déclaration form.add_error("a", "b"),Parmi eux a Est le nom du champ, b Pour un message rapide .Si
Ajoutez ceci, Nous avons déjà fait le Code md5() Crypté. Donc le fait est que Form Zhongyao et ModelForm La même chose est de définir la méthode de crochet correspondante dans la classe .【 Vous pouvez voir dans la classe , Les champs que nous définissons ,Par exemple: username Il y a un required Propriétés,Si oui True, Ça veut dire que cet endroit ne peut pas être vide ,Par défaut True】
# (2)cookie Et session Application de
1)J'ai déjà dit cookie Et session La théorie de , C'est - à - dire les étapes suivantes , Peut être vu en combinaison avec le diagramme ci - dessous .
Premièrement: Après vérification réussie du mot de passe de l'utilisateur , Le site génère des chaînes aléatoires ;
Deuxièmement: Écrit sur le navigateur de l'utilisateur cookie Moyenne;
Troisièmement: Écris à nouveau à session Moyenne.
2)Encore. Django Moyenne, En fait, les étapes ci - dessus ont été encapsulées ,C'est - à - dire: request.session["info"] = "xxx" Déclarations. Donc à travers cette déclaration , Nous pouvons accomplir les étapes ci - dessus ,Et en conséquence info C'est xxx. Voir les notes de la section précédente pour plus de détails .Comme le montre la figure ci - dessous,Nous savons quesessionDans la file d'attente, Chaque bloc a un justificatif d'identité , Chaque bon a ses propres informations de zone (Supposons que seulement info ). Si on en décide ainsi request.session["info"] = "s",Donc tout session Les informations dans la zone correspondant aux différents bons de la file d'attente sont les suivantes: "s",Ça ne veut rien dire.
Donc,,Nous devons laisser info Le champ peut être associé à son justificatif d'identité . Donc si c'est écrit dans la boîte rouge ci - dessous, ça ira. ,Par exemple, l'entrée est " Liang xu " Informations sur l'utilisateur pour ,Après ça, info C'est basé sur les résultats de la base de données ,Oui. " Liang xu " Et Le "id" Enlevez - le., Assembler dans un dictionnaire ,C'est - à - dire: {"id": 1, "name": " Liang xu "}, De cette façon, l'information contenue dans le bon peut être dynamique , Et associé à son justificatif d'identité . Enfin, nous choisissons de rediriger vers la liste des administrateurs .
3)Django C'est implicite.cookie Et session Étapes. Comment voir les justificatifs d'identité générés par le navigateur ( C'est la pile de chaînes aléatoires dans le diagramme de structure. ).Il y a deux façons, L'un est dans le navigateur ; Un autre est dans la base de données . L'image suivante est celle du navigateur .
La figure suivante dans la base de données , Vous pouvez voir que les identifiants du navigateur et de la base de données sont les mêmes .Bien sûr., Nous pouvons également voir dans la base de données , Après le bon, il y a aussi session_data , C'est ce que nous avons dit plus tôt. info Données( Nous l'avons déposé sous forme de Dictionnaire )Crypté, Le système nous aidera à décrypter quand il sera utilisé. , Ce n'est pas mon sujet de préoccupation .
# (1) Avant de connaître l'intergiciel .
1)Comme nous l'avons mentionné précédemment, Si l'utilisateur n'est pas connecté , Beaucoup de pages sont inutiles , Par exemple, la boîte d'options encadrée ci - dessous . La logique concrète est que lorsque vous cliquez sur ces pages, vous devez vérifier si l'utilisateur est actuellement connecté ,Le cas échéant,Est accessible;Sinon,Aller à la page de connexion.
2)Comme le montre la figure ci - dessous:,Prends ça. admin/list Par exemple, Voir les notes pour plus de détails .Il y a un problème.,Pourquoi pas? request.session['info'] ,Mais... request.session.get('info') , C'est parce que la classe de données du dictionnaire prend deux valeurs , Le premier signale une erreur si le champ du dictionnaire de récupération n'existe pas , Et ce dernier revient None, Ainsi, l'utilisation de ce dernier permet de contrôler le processus .Si vous utilisez cette méthode, .Nous avons besoin d'un tel jugement de processus pour chaque page qui a besoin d'une connexion pour accéder , C'est tellement fastidieux .【 Dans toutes les fonctions de vue ,Ajouter le code suivant, C'est une opération très retardée. ,Pas assez flexible】
# (2)Traitement des intergiciels(Première connaissance)
1) Pour résoudre le problème fastidieux ci - dessus , Nous devons comprendre ce qu'est un intergiciel .Comme le montre la figure ci - dessous,A、B、C C'est trois intergiciels . Demandes de navigateur ,Va passer en premier A、B、C Ces trois intergiciels , Puis exécutez la fonction View , Exécuter la fonction de vue return Il faut aussi passer par ces trois intergiciels ,Retour au navigateur.
2)Alors, encore. Django Le Middleware in est une classe , Et puis il y en a deux dans la classe , Il y avait process_request() Méthodes, Lorsque vous avez terminé d'exécuter le retour de la fonction de vue ,Encore. process_response() Après l'exécution de la méthode, C'est le processus .Comme le montre la figure ci - dessous
Pour plus de détails sur la classe Middleware ,Comme le code suivant, C'est deux façons d'avoir un ensemble d'intergiciels .
Bien sûr., Si un intergiciel ne permet pas à la demande de continuer plus tard , La demande est retournée directement à l'intergiciel , Impossible d'atteindre la fonction de vue . C'est - à - dire l'illustration ci - dessous .Sur cette base,, Nous pouvons faire un intergiciel pour déterminer si l'utilisateur est connecté .Si vous êtes connecté, Demande de continuer à atteindre la fonction View ,Sinon, Directement à partir de l'intergiciel actuel response Je suis revenu.
# (3)Traitement des intergiciels( Liens d'expérience )
1) On a mis de côté , Essayez simplement l'intergiciel .Comme le montre la figure ci - dessous,Nous devons savoir, L'intergiciel défini doit hériter de from django.utils.deprecation import MiddlewareMixin .
2) Pour appliquer ,J'en ai besoin. settings.py Dans le fichier MIDDLEWARE Ajouter nos intergiciels personnalisés à cette liste , L'intergiciel qui est exécuté en premier .Comme le montre la figure ci - dessous.
3) Comme visiter une page au hasard , Vous pouvez voir les résultats de la sortie comme suit: . Vous pouvez voir que le processus est cohérent avec ce que nous avons dit précédemment. .
Nous avons remarqué, Dans la classe de middleware que nous avons définie à l'origine ,process_request() La méthode n'a pas de valeur de retour, En fait, c'est un retour None.Si on recommence process_request() La méthode définit return Valeur de, Après avoir exécuté l'intergiciel actuel, vous retournez directement au navigateur ,Plus de descente. Comme le montre la figure ci - dessous
# (4)Traitement des intergiciels(Sur le terrain)
1)In Django Moyenne, Sans connexion de l'utilisateur , Quand le navigateur va faire une demande , L'intergiciel renvoie des informations sans connexion , Mais les navigateurs ne connaissent pas le processus des intergiciels , Vous continuerez donc à essayer d'accéder à cette fonction de vue , Ce cycle infini .Donc,, Nous devons exclure les pages accessibles sans connexion ,C'est - à - dire, Quand nous avons de nouveau accédé au navigateur , Détecter la requête actuelle du navigateur url,C'est url C'est ce qu'on va exclure .
2)Mise en œuvre du Code, N'oubliez pas de vous rappeler settings.py Inscription ci - dessus.
# (1)Déconnecter l'utilisateur
1)Comme le montre la figure ci - dessous, Pour le principe de déconnexion .
2)Django La mise en œuvre de cette étape est en fait très simple ,On peut utiliser request.session.clear() La méthode facilite la déconnexion . Nous devons également définir une fonction de déconnexion pour la fonction de déconnexion . Les codes spécifiques sont les suivants .En même temps, Nous allons sur la page principale pertinente layout.html Écrivez le chemin vers lequel vous voulez vous déconnecter .
# (2) Problème de nom de connexion de l'utilisateur
1)Nous avons remarqué,Lorsque l'utilisateur se connecte, De toute façon, c'est liang xu ,Ce n'est pas ce qu'on voulait. Nous avons besoin d'un nom d'utilisateur ici vous devez assigner le nom d'utilisateur correspondant en fonction du nom de l'utilisateur connecté .
2) C'est le moment d'utiliser les retours request Paramètre, On est au master layout.html Dans la page,Ajouter directement { {request.session.info.name}} C'est tout..
Remarquez pourquoi il y a info, Parce qu'on a écrit info Ce dictionnaire. Comme le montre la figure ci - dessous .
# (1)Code de vérification de l'image
1) Le Code de vérification d'image est utilisé pour empêcher les pirates informatiques de pirater violemment le mot de passe du compte de l'utilisateur .C'est très compréhensible., Avec un code de vérification, chaque fois qu'un hacker essaie un mot de passe , Un autre boulot , Par exemple, il est difficile de remplir automatiquement le Code de vérification ,Sauf si ça marche. ocr Fais - le.【 On va aller plus loin 】
# (2)pillow Utilisation du module.
1) Utilisation de la méthode de base pillow Bibliothèque(C'est - à - dire: PIL)Créer une image, L'utilisation spécifique est le Code et les commentaires suivants .
2)Outils de brosse ImageDraw,Comme le montre la figure ci - dessous
3) Utilisez l'outil pinceau pour dessiner des points .In 2) Nous utilisons des outils de brosse ImageDraw.Draw() La méthode crée draw Objet pinceau. Ensuite, nous pouvons utiliser cet objet de pinceau pour l'opération de peinture .Voici le code spécifique.
Nous avons exécuté img.show() Méthodes pour voir les effets réels ,Comme le montre la figure ci - dessous:
4) Utiliser des objets de pinceau pour dessiner des lignes .
L'effet est montré,
5) Utilisez un objet de pinceau pour dessiner un cercle . Il est particulièrement important de noter ici que les deux coordonnées du point de départ et du point d'extrémité ne sont pas le début du cercle dessiné , C'est un cercle entre ces deux coordonnées. .Peut être compris comme suit: (x0, y0)Pour les coordonnées du coin supérieur gauche,(x1, y1) .Cercle tangent intérieur d'un carré entouré des coordonnées du coin inférieur droit .
Voici les résultats que nous avons examinés. :
6) Écrire du texte avec un objet de pinceau
Les résultats sont présentés dans la figure:
7) Définir un texte de police spécial . Voir la note ci - dessous pour plus de détails .
Les résultats de sortie sont présentés dans la figure:
# (3)Basé sur pillow Module de code de vérification d'image pour .
1)Donnez le Code directement. Ça vient de Wu.sir De la blogosphère. Donc nous pouvons faire ce code comme un plug - in approprié pour l'arrière - plan . Quant à la logique du Code, elle est aussi simple ,Il n'y a pas de détails ici.Merci encore Wu.sir !!!
import random from PIL import Image, ImageDraw, ImageFont, ImageFilter def check_code(width=120, height=30, char_length=5, font_file='kumo.ttf', font_size=28): code = [] img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255)) draw = ImageDraw.Draw(img, mode='RGB') def rndChar(): """ Générer des lettres aléatoires :return: """ return chr(random.randint(65, 90)) def rndColor(): """ Générer des couleurs aléatoires :return: """ return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255)) # Écrire des mots font = ImageFont.truetype(font_file, font_size) for i in range(char_length): char = rndChar() code.append(char) h = random.randint(0, 4) draw.text([i * width / char_length, h], char, font=font, fill=rndColor()) # Écrire le point d'interférence for i in range(40): draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor()) # Écrivez le cercle d'interférence for i in range(40): draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor()) x = random.randint(0, width) y = random.randint(0, height) draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor()) # Dessinez la ligne d'interférence for i in range(5): x1 = random.randint(0, width) y1 = random.randint(0, height) x2 = random.randint(0, width) y2 = random.randint(0, height) draw.line((x1, y1, x2, y2), fill=rndColor()) # img.filter() Pour le filtrage d'images ,ImageFilter.EDGE_ENHANCE_MORE C'est une façon d'améliorer l'image , Les bords peuvent être renforcés en profondeur # Références:https://wenku.baidu.com/view/b28e261d64ec102de2bd960590c69ec3d5bbdbab.html img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) return img, ''.join(code)
# (4)Mise en œuvre du Code.
1) Nous sommes revenus à l'avant login.html Page, Écrivez le Code de vérification ( Ici, on va pythonav Le réseau de ressources peut prendre directement html Code). La boîte rouge ci - dessous est la fonction de vue de notre Code de vérification d'image url.
2) Écrire une fonction de vue .
Les résultats sont présentés ci - dessous., La case rouge est le Code de vérification que nous avons généré nous - mêmes. :