Contacts

Déconnexion ordinaire vue HTML. Vues Connectez-vous et déconnectez-vous. Créer la page principale

Beaucoup commencent à écrire un projet pour travailler avec la seule tâche, sans oublier qu'il peut devenir un système de gestion multijoueur, bien, par exemple, Dieu et Dieu, la production. Et tout semble génial et cool, tout fonctionne jusqu'à ce que vous commenciez à comprendre que le code écrit est entièrement entièrement entièrement de béquilles et de codes hard. Le code est mélangé avec la mise en page, les demandes et les béquilles, ce qui est parfois la lecture. Il y a un problème urgent: lors de l'ajout de nouvelles fonctionnalités, il est nécessaire de gêner ce code pendant une très longue période, de rappeler "et qu'est-ce que cela a été écrit là-bas?" Et maudire vous-même dans le passé.

Vous pouvez même entendre parler des modèles de conception et même retourner ces merveilleux livres:

  • E. Gamma, R. Helm, R. Johnson, J. Wlissidess "prend des conceptions orientées objet. Modèles de conception ";
  • M. Fowler "Architecture des applications logicielles d'entreprise".
Et beaucoup, non effrayés par les énormes lignes directrices et la documentation, ont tenté d'étudier l'un des cadres modernes et face à la complexité de la compréhension (en raison de la présence de nombreux concepts d'architecture de manière rusée à l'autre) a reporté l'étude et l'application de modernes ingrédients dans la "boîte longue".

L'article soumis sera utile principalement par novice. En tout état de cause, j'espère que dans quelques heures, vous pouvez avoir une idée de la mise en œuvre du modèle MVC, qui se situe au cœur de tous les cadres Web modernes et obtenez également "la nourriture" pour une réflexion supplémentaire sur le " comment faire". À la fin de l'article, une sélection de liaisons utiles, qui contribueront également à déterminer ce que le cadre Web consiste (en plus de MVC) et à la manière dont ils fonctionnent.

Les programmeurs PHP localisés sont peu susceptibles de trouver quelque chose de nouveau dans cet article pour eux-mêmes, mais leurs commentaires et leurs commentaires au texte principal seraient très à la hauteur! Parce que Sans la théorie, la pratique est impossible et sans pratique la théorie est inutile, elle sera d'abord une petite théorie, puis nous nous tournons vers la pratique. Si vous connaissez déjà le concept MVC, vous pouvez ignorer la section avec la théorie et aller immédiatement à la pratique.

1. Théorie

Le modèle MVC décrit un moyen simple de créer une structure d'application, dont la succursale de la logique commerciale de l'interface utilisateur. En conséquence, l'application est plus facile que la mise à l'échelle, est testée, accompagnée et bien sûr mise en œuvre.

Considérons le diagramme de modèle MVC conceptuel (à mon avis - c'est le système le plus réussi de ceux que j'ai vu):

Dans l'architecture MVC, le modèle fournit des règles de données et de logiques commerciales, la présentation est responsable de l'interface utilisateur et du contrôleur fournit une interaction entre le modèle et la représentation.

La séquence d'applications MVC typique peut être décrite comme suit:

  1. Lorsque l'utilisateur arrive à la ressource Web, le script d'initialisation crée une instance de l'application et le démarre à exécuter.
    Cela affiche l'apparence, disons la page principale du site.
  2. L'application reçoit une demande de l'utilisateur et détermine le contrôleur et l'action demandés. Dans le cas de la page principale, l'action par défaut est effectuée ( indice.).
  3. L'application crée une instance du contrôleur et démarre la méthode d'action,
    dans lequel, par exemple, contient des appels de modèle qui lisent les informations de la base de données.
  4. Après cela, l'action génère une présentation avec les données obtenues à partir du modèle et affiche le résultat à l'utilisateur.
Modèle - contient la logique de l'entreprise de l'application et comprend des méthodes d'échantillonnage (ces méthodes d'orèse), traitement (par exemple, règles de validation) et fournir des données spécifiques, ce qui le rend souvent très épais, ce qui est tout à fait normal.
Le modèle ne doit pas interagir directement avec l'utilisateur. Toutes les variables liées à la demande de l'utilisateur doivent être traitées dans le contrôleur.
Le modèle ne doit pas générer de code HTML ou un autre code d'affichage pouvant varier en fonction des besoins de l'utilisateur. Ce code devrait être traité à l'espèce.
Le même modèle, par exemple, le modèle d'authentification de l'utilisateur peut être utilisé à la fois dans l'utilisateur et dans la partie administrative de l'application. Dans ce cas, vous pouvez créer un code général dans une classe distincte et hérité de celle-ci, déterminer des méthodes spécifiques à héritiers.

Vue - Utilisé pour spécifier l'affichage externe des données obtenues à partir du contrôleur et du modèle.
Les types contiennent des marquements HTML et de petits inserts de code PHP pour contourner les données, formater et afficher des données.
Ne pas accéder directement à la base de données. Cela devrait faire des modèles.
Ne fonctionnez pas avec des données obtenues à partir de la demande de l'utilisateur. Cette tâche doit être effectuée par le contrôleur.
Il peut accéder directement aux propriétés et aux méthodes du contrôleur ou des modèles pour obtenir des données prêtes à la ligne.
Les types sont généralement séparés par un gabarit commun contenant un balisage, commun à toutes les pages (par exemple, un capuchon et un sous-sol) et une partie du modèle utilisé pour afficher les données de la sortie du modèle ou l'affichage des formulaires de saisie de données.

Manette - Lien de liant connectant des modèles, des types et d'autres composants de l'application de travail. Le contrôleur est responsable de la gestion des demandes des utilisateurs. Le contrôleur ne doit pas contenir de requêtes SQL. Il vaut mieux les garder dans des modèles. Le contrôleur ne doit pas contenir HTML et autre balisage. Cela vaut la peine d'espoir.
Dans une application MVC bien conçue, les contrôleurs sont généralement très minces et ne contiennent que quelques douzaines de lignes de code. Quoi, vous ne pouvez pas parler de contrôleurs de graisse stupides (SFC) dans CMS Joomla. La logique du contrôleur est assez typique et sa grande partie est faite dans les classes de base.
Modèles, au contraire, très épais et contiennent la majeure partie du code associé au traitement des données, car La structure de données et la logique commerciale contenues dans elles sont généralement assez spécifiques à une application spécifique.

1.1. Contrôleur avant et contrôleur de page

Dans la plupart des cas, l'interaction de l'utilisateur avec l'application Web passe dans les liens par référence. Regardez maintenant la barre d'adresse du navigateur - sur ce lien que vous avez reçu ce texte. Pour d'autres liens, par exemple, situé à droite sur cette page, vous recevrez d'autres contenus. Ainsi, le lien représente une commande d'application Web spécifique.

J'espère que vous avez déjà remarqué que différents sites peuvent être des formats différents différents pour la construction d'une chaîne d'adresse. Chaque format peut afficher l'architecture d'applications Web. Bien que ce ne soit pas toujours le cas, mais dans la plupart des cas, c'est un fait évident.

Considérez deux options pour la barre d'adresse, qui affiche du texte et du profil utilisateur.

Première option:

  1. www.example.com/article.php?id\u003d3
  2. www.example.com/user.php?id\u003d4.
Ici, chaque script est responsable de l'exécution d'une commande spécifique.

Deuxième option:

  1. www.example.com/index.php?article\u003d3
  2. www.example.com/index.php?user\u003d4.
Et ici tous les appels se produisent dans un scénario index.php..

Approchez avec de nombreux points d'interaction que vous pouvez regarder sur les forums avec le moteur PhPBB. Voir le forum survient via le script viewforum.php., vue sur le sujet à travers vieftopic.php. etc. La deuxième approche, avec accès à travers un fichier de script physique, peut être observée dans mon MODX de CMS préféré, où tous les appels passent à travers index.php..

Ces deux approches sont complètement différentes. La première est caractéristique du modèle de contrôleur de page (contrôleur de page) et la deuxième approche est implémentée par le motif du contrôleur de requête (contrôleur avant). Le contrôleur de page est bien utilisé pour les sites avec une logique assez simple. À son tour, le contrôleur de demande combine toutes les actions visant à traiter les demandes dans un seul endroit, ce qui lui donne des fonctionnalités supplémentaires, grâce auxquelles vous pouvez mettre en œuvre des tâches plus difficiles que généralement résolues par le contrôleur de page. Je n'entrerai pas dans les détails de la mise en œuvre du contrôleur de page et je ne dirai que le contrôleur de requête sera développé dans la partie pratique (une similitude).

1.2. Routage de l'URL

Le routage de l'URL vous permet de configurer la demande de réception de demandes à l'URL qui ne répondent pas aux fichiers d'application réels, ainsi que d'utiliser des CNC qui sont sémantiquement significatifs pour les utilisateurs et sont préférés pour l'optimisation des moteurs de recherche.

Par exemple, pour la page habituelle qui affiche le formulaire de commentaires, l'URL pourrait ressembler à ceci:
http://www.example.com/contacts.php?Action\u003dFeedback

Code de traitement approximatif dans ce cas:
interrupteur ($ _GET ["action"] (cas "À propos": Exiger_once ("About.php"); // page "À propos de nous" Se rompre; Cas "Contacts": requis_once ("Contacts.php"); // page "Contacts" Se rompre; Cas "Feedback": Exiger_once ("feedback.php"); // page "Feedback" Se rompre; Valeur par défaut: requis_once ("page 404.php"); // page "404" pause; )
Je pense que presque tout le monde l'a fait.

À l'aide du moteur de routage URL, vous pouvez configurer l'application pour la réception de telles demandes dans les mêmes informations:
http://www.example.com/contacts/feedback

Ici, les contacts sont un contrôleur et les commentaires sont la méthode des contacts du contrôleur qui représente la forme de rétroaction, etc. Nous reviendrons sur cette question dans la partie pratique.

Il convient également de savoir que de nombreux routeurs-cadres Web vous permettent de créer des itinéraires d'URL arbitraires (spécifiez la partie de chaque partie de l'URL) et les règles de leur traitement.
Maintenant, nous avons des connaissances théoriques suffisantes pour aller à la pratique.

2. pratique

Pour commencer, créez la structure de fichier et les dossiers suivants:

En ce qui concerne l'avenir, je dirai que le dossier principal stockera le modèle de classe de base, la vue et le contrôleur.
Leurs descendants seront stockés dans les administrateurs des contrôleurs, des modèles et des vues. Déposer index.php. C'est un point au cours de la demande. Déposer bootstrap.php. Lance le téléchargement de l'application en connectant tous les modules nécessaires, etc.

Nous irons séquentiellement; Ouvrez le fichier index.php et remplissez-le avec le code suivant:
INI_SET ("DISPLAY_ERRORS", 1); Exiger_once "application / bootstrap.php";
Il ne devrait y avoir aucune question ici.

Ensuite, nous passons immédiatement à Falu bootstrap.php.:
exiger_once "noyau / modèle.php"; Exiger_once "noyau / vue.php"; Exiger_once "core / contrôleur.php"; Exiger_once "noyau / route.php"; Route :: Démarrer (); // exécuter le routeur
Les trois premières lignes seront connectées jusqu'à présent les fichiers de noyau inexistants. Les dernières lignes se branchent dans le fichier avec la classe de routeur et exécutez-la pour appeler la méthode START START.

2.1. Mise en œuvre du routeur URL

Jusqu'à présent, je vais rejetterai de la mise en œuvre du modèle MVC et prendra la mrachrutisation. Le premier sh est que nous devons faire, écrivez le code suivant dans .htaccess.:
RewriteEngine sur RewriteCond% (request_filename)! -F réécritecond% (demande_filename)! -D Rewriterule. * Index.php [l]
Ce code redirigera le traitement de toutes les pages sur index.php.Ce dont nous avons besoin. Rappelez-vous dans la première partie. Nous avons parlé du contrôleur frontal ?!

Routing Nous serons placés dans un fichier séparé route.php. Dans le répertoire principal. Dans ce fichier, nous décrivons la classe d'itinéraire, qui exécutera les méthodes de contrôleurs, ce qui générera à son tour une vue de pages.

Le contenu du fichier route.php

route de classe ( Statique. démarrage de la fonction () ( // Contrôleur et action par défaut $ Contrôleur_name \u003d "Main"; $ Acte_name \u003d "index"; $ Itinéraires \u003d exploser ("/", $ _server ["demande_uri"]); // Obtenir le nom du contrôleur Si (! Vide ($ itinéraires)) ($ contrôleur_name \u003d $ itinéraires;) // Obtenir le nom de l'action Si (! vide ($ itinéraires)) ($ Action_Name \u003d $ itinéraires;) // Ajouter des préfixes $ modèle_name \u003d "Model_". $ contrôleur_name; $ Contrôleur_name \u003d "contrôleur_". $ Contrôleur_name; $ Acte_name \u003d "action_". $ Acte_name; // pochette le fichier avec la classe de classe (le fichier modèle peut ne pas être) $ modèle_file \u003d strtoolower ($ Model_Name). "PHP"; $ Modèle_path \u003d "Application / Modèles /". $ Model_file; Si (File_Exists ($ Model_Path)) (inclure "Application / Modèles /". $ Model_file;) // pochette le fichier avec la classe du contrôleur $ Contrôleur_file \u003d strtoolower ($ contrôleur_name). "PHP"; $ Contrôleur_path \u003d "applications / contrôleurs /". $ Contrôleur_file; Si (fichier_exists ($ contrôleur_path)) (inclure "Application / contrôleurs /". $ contrôleur_file;) d'autre ( / * Il serait correct de jeter une exception ici, mais de simplifier immédiatement faire une redirection à la page 404 * / Route :: errorpage404 (); ) // Créer un contrôleur Contrôleur $ \u003d nouveau $ contrôleur_name; $ Action \u003d $ acte_name; Si (méthody_exists ($ contrôleur, $ action)) ( // appeler le contrôleur $ Contrôleur -\u003e $ Action (); ) AUTRE ( // aussi il serait plus sage de jeter une exception Route :: errorpage404 (); ))) error de fonctionPage404 () ( $ hôte \u003d "http: //". $ _ serveur ["http_host"]. "/"; En-tête ("http / 1.1 404 non trouvé"); Tête ("Statut: 404 non trouvé"); Tête ("Emplacement:". $ Hôte. "404"); )))


Je note qu'une logique très simplifiée est mise en œuvre dans la classe (malgré le code surround) et peut même avoir des problèmes de sécurité. C'était fait l'intention, parce que Écrire une classe de routage à part entière mérite au moins un article séparé. Considérez les points principaux ...

Dans l'élément de tableau global $ _Server ["request_uri"] contient l'adresse complète de laquelle l'utilisateur adressé.
Par exemple: exemple.ru/contacts/feedback

En utilisant une fonction exploser. La séparation des adresses est faite. En conséquence, nous obtenons le nom du contrôleur pour l'exemple ci-dessus, il s'agit d'un contrôleur. contacts. et le nom de l'action, dans notre cas - retour.

Ensuite, le fichier de modèle est connecté (le modèle peut être manquant) et le fichier de contrôleur, le cas échéant, s'il est créé, une instance du contrôleur est créée et une action est appelée à nouveau si elle a été décrite dans la classe du contrôleur. .

Ainsi, lors de la commutation, par exemple, à:
exemple.com/portfolio.
ou alors
exemple.com/portfolio/index
le routeur effectue ce qui suit:

  1. connectez le fichier modèle_portfolidio.php dans le dossier Modèles contenant la classe Model_Port Folio;
  2. connectez le fichier contrôleur_portfolidio.php dans le dossier Contrôleurs comprenant la classe Controller_Portfolio;
  3. créez une instance de la classe Controller_Portfolio et provoque l'action par défaut - action_index décrite dans celle-ci.
Si l'utilisateur tente de contacter l'adresse d'un contrôleur inexistant, par exemple:
exemple.com/ufo.
cela le transférera à la page "404":
exemple.com/404.
La même chose se produit si l'utilisateur passe à l'action qui n'est pas décrit dans le contrôleur.

2.2. Retour à la mise en œuvre de MVC

Nous nous tournons vers le dossier principal et ajoutons trois autres fichiers au fichier itinéraire.php: modèle.php, vue.php et contrôleur.php

Permettez-moi de vous rappeler qu'ils contiendront des cours de base, dont nous allons commencer par écrit.

Contenu du fichier modèle.php.
modèle de classe ( Publique fonction get_data () ( } }
La classe de classe contient la seule méthode d'échantillonnage de données vide qui se chevauchera dans les classes des descendants. Lorsque nous créons des cours de descendants, tout deviendra plus clair.

Contenu du fichier voir.php.
vue de la classe ( // publique $ template_view; // Ici, vous pouvez spécifier une vue générale de la valeur par défaut. fonction générer ( $ Content_view, $ template_view, $ data \u003d null) { / * Si (is_array ($ données)) (// Nous transformons les éléments du tableau dans les variables d'extrait ($ données);) * / Inclure "application / vues /". $ Template_view; )))
Il n'est pas difficile de deviner que la méthode produire Conçu pour former un type. Les paramètres suivants sont transmis à celui-ci:

  1. $ Content_file - types de contenus de page reflétant;
  2. $ template_file - Modèle commun pour toutes les pages;
  3. $ Data - Un tableau contenant des éléments de contenu de page. Généralement rempli dans le modèle.
La fonction include est connectée dynamiquement par un modèle commun (vue), à \u200b\u200bl'intérieur de laquelle la vue sera intégrée.
pour afficher un contenu de page spécifique.

Dans notre cas, le modèle général contiendra l'en-tête, le menu, la barre latérale et le pied de page, et le contenu de la page sera contenu dans un formulaire séparé. Encore une fois, cela est fait pour simplifier.

Contenu du fichier contrôleur.php.
contrôleur de classe ( Public $ modèle; Public $ vue; fonction __Construction () ( $ ceci -\u003e vue \u003d nouvelle vue (); ))))
Méthode action_index. - Il s'agit de l'action causée par défaut, nous allons le bloquer lors de la mise en œuvre des classes des descendants.

2.3. Mise en œuvre des classes de descendants de modèle et de contrôleur, créant une vue »

Maintenant, le plus intéressant commence! Notre site Web de site Web comprendra les pages suivantes:
  1. le principal
  2. Prestations de service
  3. Portefeuille
  4. Contacts
  5. Ainsi que - page "404"
Pour chacune des pages, il existe son propre contrôleur dans le dossier Contrôleurs et afficher dans le dossier Vues. Certaines pages peuvent utiliser un modèle ou un modèle à partir du dossier Modèles.

Le fichier sélectionné séparément sur la figure précédente. template_view.php. - Ceci est un modèle contenant le balisage général de toutes les pages. Dans le cas le plus simple, il pourrait ressembler à ceci:
<hTML LANG \u003d "ru"\u003e <tête\u003e <meta Charset \u003d "UTF- 8"\u003e <titre\u003ele principaltitre\u003e tête\u003e <corps\u003e $ Content_view; ?\u003e corps\u003e hTML\u003e
Pour donner au site de la vue présentable, le modèle CSS se chevauche et l'intégrant dans notre site en modifiant la structure de balisage HTML et en connectant les fichiers CSS et JavaScript:
<lien rel \u003d "stylesheet" type \u003d "text / css" href \u003d "/ css / style.css" /\u003e <script SRC \u003d "/ JS / JQuery-1.6.2..2.js" Type \u003d "Texte / JavaScript"\u003escript\u003e

À la fin de l'article, dans la section «Résultat», une référence au référentiel GitHub avec le projet, qui a été effectuée pour intégrer un modèle simple.

2.3.1. Créer la page principale

Commençons par le contrôleur contrôleur_main.php., Voici son code:
classe Controller_Main étend le contrôleur ( fonction Action_Index () ( $ ceci -\u003e Affichage-\u003e Générez ("Main_View.PHP", "TEMPATE_VIEW.PHP"); )))
Dans la méthode produire Une instance de la classe d'affichage est transmise par les noms des fichiers de modèle communs et le type de contenu de page.
En plus de l'indice du contrôleur, bien sûr, d'autres actions peuvent être contenues.

Le fichier avec une vue commune nous avons considérée plus tôt. Considérez le fichier de contenu main_View.php.:
<h1\u003eBienvenue!h1\u003e <p\u003e <img src \u003d "/ images / bureau-petit.jpg" align \u003d "gauche"\u003e <un href \u003d "/"\u003eÉquipe Ololosh.a\u003e - Équipe de spécialistes de première classe dans le développement de sites Web avec de nombreuses années d'expérience en collectant des masques mexicains, des statues en bronze et de pierre d'Inde et de Ceylan, des bas-reliefs et des sculptures créées par les maîtres de l'Afrique équatoriale il y a cinq à six siècles .. .p\u003e
Il contient un simple balisage sans appels PHP.
Pour afficher la page principale, vous pouvez utiliser dans l'une des adresses suivantes:

  • méthodes de bibliothèques mettant en œuvre des données d'abstraction. Par exemple, les méthodes de la bibliothèque PEAR MDB2;
  • méthodes ORM;
  • méthodes de travail avec NOSQL;
  • et etc.
  • Pour la simplicité, ici, nous n'utiliserons pas les demandes SQL ou les opérateurs ORM. Au lieu de cela, nous saisissons des données réelles et remboursons immédiatement la matrice résultante.
    Fichier de modèle modèle_portfolidio.php. Position dans le dossier Modèles de modèles. Voici son contenu:
    classe modèle_portfolio étend le modèle ( Publique fonction get_data () ( Array de retour (tableau ("Année" \u003d\u003e "2012", "Site" \u003d\u003e "http://dunkelbeer.ru", "Description" \u003d\u003e "Le site Dunkel Dark Beer Promotion du producteur allemand Löwenbraü a produit dans la brassage de la Russie" Can Ibev "."), Array ("Année" \u003d\u003e "2012", "Site" \u003d\u003e "http://zopomobile.ru", "Description" \u003d\u003e "Catalogue russe des téléphones chinois de ZOPO sur la base d'un système d'exploitation Android et des accessoires."), // FAIRE); )))

    La classe de contrôleur de modèle est contenue dans le fichier. contrôleur_portfolio.php., Voici son code:
    classe Controller_Portfolio étend le contrôleur ( fonction __Construction () ( $ ceci -\u003e modèle \u003d nouveau modèle_portfolio (); $ ceci -\u003e vue \u003d nouvelle vue (); ) fonction Action_Index () ( $ Données \u003d ceci -\u003e modèle-\u003e get_data (); $ ceci -\u003e Affichage-\u003e Générer ("Portfolio_View.PHP", "TEMPATE_VIEW.PHP", $ données); )))
    Dans une variable données. Le tableau renvoyé par la méthode est enregistré get_data.que nous avons considéré plus tôt.
    Ensuite, cette variable est transmise en tant que paramètre de méthode. produireCe qui est également transmis: le nom du fichier avec un modèle commun et un nom de fichier contenant une vue du contenu des pages.

    Afficher contenant le contenu de la page est dans le fichier portfolio_view.php..

    Portefeuille

    Tous les projets du tableau suivant sont fictifs. N'essayez même pas de passer par les liens vers les liens. " ; }


    Lien vers GitHub: https://github.com/vitalyswipe/tinymvc/zipball/v0.1

    Mais dans cette version, j'ai esquissé les classes suivantes (et les correspondantes):

    • Contrôleur_login dans lequel un formulaire avec un formulaire pour entrer dans un identifiant et un mot de passe est généré, après avoir rempli la procédure d'authentification et, le cas échéant, l'utilisateur est redirigé vers l'administrateur.
    • Contorler_Admin avec une action indexée, dans laquelle il est coché si l'utilisateur a déjà été autorisé sur le site en tant qu'administrateur (le cas échéant, le type d'administrateur est affiché) et la déconnexion d'exercice pour le chauffage.
    L'authentification et l'autorisation sont un autre sujet, il n'est donc pas pris en compte ici, mais seule une référence est donnée à ce qui précède, de sorte qu'il provient de quoi pousser.

    4. Conclusion

    Le modèle MVC est utilisé comme base architectural dans de nombreux cadres et CMS, créés afin de pouvoir développer des décisions qualitativement plus complexes pour une période plus courte. Cela a été rendu possible en augmentant le niveau d'abstraction, car il y a une limite de la complexité des structures pouvant exploiter le cerveau humain.

    Mais, l'utilisation de cadres Web, tels que Yii ou Kohana, composé de plusieurs centaines de fichiers, lors du développement d'applications Web simples (par exemple, des sites de visite) n'est pas toujours approprié. Nous pouvons maintenant créer un beau modèle MVC, afin de ne pas mélanger le code PHP, HTML, CSS et JavaScript dans un fichier.

    Cet article ressemble davantage à un point de départ pour étudier le CMF qu'un exemple de quelque chose de vrai correctement, ce qui peut être pris comme base de votre application Web. Peut-être qu'elle vous a même inspiré et que vous pensez déjà à écrire votre microfraymwork ou votre CMS en fonction de MVC. Mais, avant d'inventer un autre vélo avec "Blackjack et Sluts", repensez-vous que vos efforts peuvent peut-être être envoyés de manière sage avec le développement et aider la communauté d'un projet existant ?!

    P.S.: L'article a été réécrit en tenant compte des commentaires laissés dans les commentaires. La critique s'est avérée très utile. À en juger par la réponse: Les commentaires, les appels dans un nombre personnel et nombre d'utilisateurs ont ajouté des postes Ajouter aux favoris Joindre ce message n'était pas si mauvais. Malheureusement, il n'est pas possible de prendre en compte tous les souhaits et d'écrire de plus en plus de détails sur le manque de temps ... mais peut-être que cela rendra ces mystérieuses personnalités qui moins l'option originale. Bonne chance dans des projets!

    5. Une sélection de références SABZH utiles

    L'article est très souvent affecté par le sujet des cadres Web - il s'agit d'un sujet très étendu, car même microfraymvory consiste en de nombreuses composantes de la ruse liées à l'autre et qu'il ne serait pas nécessaire que l'un des articles parle de ces composants. Néanmoins, j'ai décidé d'apporter ici une petite sélection de liens (pour lesquels je suis allé lors de la rédaction de cet article), qui se rapportent en quelque sorte au thème des cadres.

    Cet exemple montre comment se déconnecter automatiquement avec la configuration de la sécurité des tiges par défaut.

    Pour vous déconnecter, nous devons simplement accéder à l'URL "/ déconnexion" avec la demande postale.

    Dans la forme post / déconnexion, nous devons également inclure le jeton CSRF, qui constitue une protection contre l'attaque du CSRF.

    Soit "voir l'exemple comment faire ça.

    Classe de configuration Java.

    . @Configuration @enablewebsecurity @enablewebmvc @ComponentsCan Classe publique AppConfig Extende WebSecurityConfigurierAdapter (Protected Vide Configure (httpSececurity HTTP) Terra une exception (http.authorizequests () .TryRequest () authentifié (). Et ().).) @Overslogin (); Void Configure (authentificationManagerBuilder Builder) jette une exception (Builder.inmemoryAuthentication () .WithUser ("Joe") .Password ("123") .Roles ("admin");) @bean Public ViewSolver Viewresolver () (nouveau internalResourceViewresolver (); Viewresolver.setprefix ("/ web-inf / vues /"); Viewresolver.SetSuffix (". JSP"); Viewsolver de retour;)))

    Notez que, dans la configuration ci-dessus, nous remplacons également la configuration (httpault http) pour omettre l'authentification de base par défaut. Nous le faisons parce que les navigateurs mettent en cache des informations d'authentification de base agressivement (après le premier login réussi) et il n'ya aucun moyen de déconner l'utilisateur de la session en cours. Dans la plupart des exemples, nous n'utiliserons pas le mécanisme d'authentification de base.

    Un contrôleur

    @Controller Public Class Examplecontroller (@RequestMapping ("/") String Public String HandleRequest2 (Map.AddaTribute ("Time", localDaTetime.now (). Tostring ()); Retournez "My-Page";))

    La page JSP

    sRC / Main / WebApp / Web-Inf / Vues / My-Page.jsp

    Exemple de sécurité de printemps

    Temps: $ (heure)



    Pour essayer des exemples, exécutez Embedded Tomcat (configuré dans POM.XML de Exemple de projet ci-dessous):

    MVN Tomcat7: Run-War

    Production.

    L'accès initial à URI "/" va rediriger vers "/ Login":

    Après avoir soumis le nom d'utilisateur et le mot de passe lors de la configuration de notre classe AppConfig:

    En cliquant sur le bouton "Déconnexion":


    Exemple de projet.

    Dépendances et technologies utilisées:

    • spring-Security-Web 4.2.3.Release: Spring-Security-Web.
    • spring-Security-config 4.2.3.Release: Spring-Security-config.
    • spring WebMVC 4.3.9.Release: Web Spring Web MVC.
    • javax.Servlet-API 3.1.0 API de servlet Java
    • JDK 1.8.
    • Maven 3.3.9

    Modifier le fichier. urls.py. Applications compte:

    de django.conf.urls importer une URL à partir de. Importation vues Urlpatterns \u003d [# # Voir la vue de connexion précédente # URL (r "^ login / $", vues.user_login, nom \u003d "Connexion"), # URL de connexion / LOGOUT URL (R "^ Connexion / $", "django.contrib.auth.views.login", nom \u003d "login"), URL (r "^ déconnections / $", "django.contrib.auth.views.logout", nom \u003d "Déconnexion"), URL (R "^ déconnecté-then-connexion / $", "django.contrib.auth.views.logout_then_login", nom \u003d "logout_then_login"),]

    Nous avons acheté le modèle d'URL pour la présentation utilisateur en ligne.précédemment conçu pour utiliser la présentation connexion. Dzhango.

    Créer un nouveau répertoire dans le répertoire des modèles de candidature compte Et nommez-le inscription. Créez un nouveau fichier dans le nouveau répertoire, nommez-le login.html.

    (% Étend "BASE.HTML"%) (% Titre du bloc%%) Connexion (% EndBlock%) (% Block Content%)

    Connexion

    (% si forme.Errors%)

    Votre nom d'utilisateur et votre mot de passe ne correspondaient pas. Veuillez réessayer.

    (% AUTRE%)

    S'il vous plaît, utilisez le formulaire suivant pour vous connecter:

    (% fin si%) (% ENDBLOCK%)

    Ce modèle pour l'entrée est très similaire à celui précédemment créé. Dzhango utilise Authentificationsitué dans django.contrib.auth.Forms.. Ce formulaire tente de vérifier l'authenticité de l'utilisateur et de générer une vérification d'erreur si le nom d'utilisateur n'était pas vrai. Dans ce cas, nous pouvons rechercher des erreurs à l'aide de la commande (% si Form.Errors%). Veuillez noter que nous avons ajouté un élément caché. Pour envoyer une valeur variable nommée suivant.

    Paramètre suivant Doit être une URL. Si ce paramètre est spécifié, ensuite après vous être connecté au système, il est redirigé vers une URL spécifiée.

    Maintenant créer un modèle logbed_out.html. À l'intérieur des modèles de catalogue inscription Et insérez le code suivant:

    (% Étend "BASE.HTML"%) (% Titre du bloc%) Déconnecté (% EndBlock%) (% Block Content%)

    Déconnecté.

    Vous avez été déconnecté avec succès. Vous pouvez vous reconnecter à nouveau.

    (% ENDBLOCK%)

    Ceci est un modèle qui sera affiché après la connexion de l'utilisateur.

    Après avoir ajouté des modèles d'URL et de modèles pour les vues d'entrée et de sortie, le site est prêt à se connecter à l'aide d'une authentification Dzhango.

    S'il vous plaît noter que la performance logout_then_login.inclus dans notre urlconf.n'a pas besoin d'un modèle car il effectue la redirection de connectez-vous..

    Maintenant, créons une nouvelle vue pour afficher le panneau de surveillance de l'utilisateur à savoir lorsque l'utilisateur entre son compte. Fichier ouvert vues.py. Applications compte Et ajouter le code suivant à celui-ci:

    de django.contrib.auth.Décorateurs impororta Import login_required @Login_required def tableau de bord (demande): Render Render (Demande, "Compte / Dashboard.html", ("Section": "Tableau de bord"))

    Nous ajoutons à notre décorateur de présentation connexion requise. Cadre d'authentification. Décorateur connexion requise. Vérifie si l'utilisateur actuel a réussi l'authentification. Si l'utilisateur a réussi l'authentification, le cordage est exécuté; Si l'utilisateur n'a pas réussi l'authentification, elle sera redirigée vers la page d'entrée.

    Nous avons également défini une variable section.. Nous allons utiliser cette variable pour suivre la partition du site, suivie de l'utilisateur.

    Vous devez maintenant créer un modèle pour représenter le panneau de surveillance. Créez un nouveau fichier à l'intérieur des modèles / compte modèles / compte / Et nommez-le tableau de bord.html :

    (% Étend "BASE.HTML"%) (% Block Titre%%) Dashboard (% EndBlock%) (% Block Teneur%)

    Tableau de bord.

    Bienvenue sur votre tableau de bord.

    (% ENDBLOCK%)

    Ajoutez ensuite le modèle URL suivant à cette modification du fichier. urls.py. Applications compte:

    Urlpatterns \u003d [# ... URL (r "^ $", vues.dashboard, nom \u003d "tableau de bord"),]

    Maintenant éditez le fichier paramètres.py.:

    De django.core.urlresolvers Importer inverse_lazy login_redirect_url \u003d Reverse_lazy ("tableau de bord") login_url \u003d inverse_lazy ("login") logout_url \u003d inverse_lazy ("Déconnexion")
    • Login_redirect_url: Rapporte quelle URL rediriger l'utilisateur après la connexion au système.
    • Login_url : URL pour rediriger l'utilisateur à l'entrée (par exemple, à l'aide du décorateur connexion requise.)
    • Logout_url : URL pour la redirection de l'utilisateur

    Nous allons maintenant ajouter à nos liens de modèle de base à l'entrée et à la sortie du site.

    Pour ce faire, il est nécessaire de déterminer si l'utilisateur actuel est entré dans le système ou non pour afficher l'état actuel approprié de l'utilisateur, le lien. L'utilisateur actuel est défini dans Httprequest L'objet de la classe d'authentification intermédiaire. L'accès à celui-ci peut être obtenu par demande.user.. L'utilisateur sera trouvé dans la requête, même si l'utilisateur n'a pas passé l'authentification. L'utilisateur non authentifié est défini dans la requête comme une instance Utilisateur anonyme.. Le meilleur moyen de vérifier le statut de l'authentification de l'utilisateur actuel - un appel demande.user.is_authentiqué ()

    Modifier la base de base.html

    Avec l'en-tête d'identification:

    Comme vous pouvez le constater, le menu Site ne s'affiche que pour les utilisateurs qui ont réussi l'authentification. Nous vérifions également la section actuelle pour ajouter l'attribut de classe sélectionné à l'élément approprié.

  • Pour mettre en surbrillance la section actuelle dans le menu à l'aide de CSS. Affiche également le nom d'utilisateur et le lien pour vous connecter si l'utilisateur a réussi l'authentification ou le lien pour vous connecter.

    Ouvert dans le navigateur http://127.0.0.1:8000/account/login/. Vous devez voir le flux d'entrée. Entrez le login et le mot de passe valides. Vous verrez ce qui suit:

    Vous pouvez voir que la section de mon tableau de bord est mise en surbrillance avec CSS, car elle a une classe choisi.. Étant donné que l'utilisateur a passé l'authentification, le nom d'utilisateur est affiché sur le côté droit de l'en-tête. Cliquez sur lien Se déconnecter.. Vous verrez la page suivante:

    Sur cette page, vous pouvez voir que l'utilisateur est sorti du système et, par conséquent, le menu du site Web n'est plus affiché. Lien sur le côté droit des spectacles de Heder maintenant Connexion.

    Si vous voyez la page de déconnexion du site d'administration Dzhango et non de votre propre page de sortie système, cochez les paramètres installés_apps et assurez-vous que django.contrib.admin. est après compte. Les deux modèles sont dans le même chemin relatif et le chargeur du modèle Dzhango utilisera la première trouvée.

    Django est livré avec beaucoup de ressources intégrées pour les cas d'utilisation les plus courants d'une application Web. L'application d'enregistrement est un très bon exemple et une bonne chose à ce sujet est que les fonctionnalités peuvent être utilisées hors de la boîte.

    Avec l'application d'enregistrement Django, vous pouvez prendre des avantages des fonctionnalités suivantes suivantes:

    • Connexion.
    • Se déconnecter.
    • S'inscrire.
    • Réinitialisation du mot de passe.

    Dans ce tutoriel, nous nous concentrerons sur les fonctionnalités de connexion et de déconnexion. Pour la réinitialisation des inscriptions et du mot de passe, vérifiez les tutoriels ci-dessous:

    Commencer.

    Avant de commencer, assurez-vous que dans votre installation installée et l'authentification Middlelled_apps et le middleware d'authentification correctement configuré dans les paramètres Middleware_Classes.

    Les deux arrivent déjà configurés lorsque vous démarrez un nouveau projet Django à l'aide de la commande StartProject. Donc, si vous n'avez pas supprimé les configurations initiales, vous devriez être installée.

    Si vous démarrez un nouveau projet Juste pour suivre ce tutoriel, créez un utilisateur à l'aide de la ligne de commande, afin que nous puissions tester les pages de connexion et de déconnexion.

    $ Python gérer.py crééeuperuser

    À la fin de cet article, je fournirai le code source de l'exemple avec la configuration minimale.

    Configurer les itinéraires d'URL

    Premièrement importer le module django.contrib.auth.views et ajoutez une route d'URL pour connaître les vues de connexion et de déconnexion:

    de django.conf.urls Import URL à partir de django.contribe importer admin à partir de django.contrib.auth importer des vues comme auth_views urlpattats \u003d [URL (R "^ Connexion / $", auth_views. Login, nom \u003d "Connexion"), URL ( R "^ déconnexion / $", auth_views. Déconnexion, nom \u003d "Déconnexion"), URL (R "^ admin /", admin. Site. URL),]

    Créer un modèle de connexion

    Par défaut, la vue Django.Contrib.ATth.Views.Login tente de rendre le modèle d'enregistrement / login.html. Donc, la configuration de base créerait un dossier nommé registre et placerait un gabarit login.html à l'intérieur.

    Après un modèle de connexion minimal:

    (% Étend "BASE.HTML"%) (% Titre du bloc%%) Connexion (% EndBlock%) (% Bloquer le contenu%)

    Connexion.

    (% Csrf_token%) ((form.as_p)) (% ENDBLOCK%)

    Cet exemple simple valide déjà le nom d'utilisateur et le mot de passe et authentifier correctement l'utilisateur.

    Personnalisation de la vue de connexion

    Vous pouvez passer quelques paramètres à la vue de connexion pour le faire correspondre à votre projet. Par exemple, si vous souhaitez stocker votre modèle de connexion ailleurs que ce qui peut passer le nom du modèle en tant que paramètre:

    URL (R "^ Connexion / $", auth_views. Connexion, ("Template_name": "CORE / LOGIN.HTML"), NOM \u003d "Connexion"),

    Vous pouvez également passer un formulaire d'authentification personnalisé à l'aide du paramètre authentification_form, en cas de mise en œuvre d'un modèle utilisateur personnalisé.

    Maintenant, une configuration très importante est effectuée dans le fichier Paramètres.py, qui est l'URL Django redirigera l'utilisateur après une authentification réussie.

    Dans le fichier Paramètres.py Ajouter:

    Login_redirect_url \u003d "home"

    La valeur peut être une URL codée ou un nom d'URL. La valeur par défaut pour login_redirect_url est / comptes / profil /.

    Il est également important de noter que Django tentera de rediriger l'utilisateur au prochain Get Param.

    Configuration de la vue de déconnexion

    Après avoir suivi la vue Django.Contrib.Auth.Views.Logout, Django rendra le modèle d'enregistrement / logbed_out.html. De la même manière que nous avons fait dans la vue de connexion, vous pouvez passer un modèle différent, comme si:

    URL (R "^ déconnections / $", auth_views. Déconnexion, ("template_name": "logbed_out.html"), nom \u003d "Déconnexion"),

    Habituellement, je préfère utiliser le paramètre Next_Page et rediriger soit à la page d'accueil de mon projet, soit à la page de connexion quand il est logique.



  • Avez-vous aimé l'article? Partagez-le


    AnProjetLa description
    . "$ Ligne [" année "].""$ Ligne [" site "].". "$ Ligne [" Description "]."