Contacte

Vizualizarea obișnuită a deconectării HTML. Vizualizări Conectați-vă și deconectați-vă. Creați pagina principală

Mulți încep să scrie un proiect pentru a lucra cu singura sarcină, fără a implica că poate crește într-un sistem de management multiplayer, de exemplu, Dumnezeu și Dumnezeu, producție. Și totul pare grozav și rece, totul funcționează până când începeți să înțelegeți că codul care este scris este în întregime în întregime din cârje și de cod hard. Codul este amestecat cu aspect, cereri și cârje, care uneori chiar le citește. Există o problemă de presare: atunci când adăugați noi caracteristici, este necesar să vă încurcați cu acest cod de foarte mult timp, amintindu-vă "și ce a fost scris acolo?" Și blestemați-vă în trecut.

Puteți să auziți chiar despre șabloane de design și chiar și prindeți aceste cărți minunate:

  • E. Gamma, R. Helm, R. Johnson, J. Wlissidess "ia de design orientat pe obiecte. Modele de design ";
  • M. Fowler "Arhitectura aplicațiilor software corporative".
Și mulți, care nu sunt înspăimântați de orientările și documentația uriașe, au încercat să studieze oricare dintre cadrele moderne și să se confrunte cu complexitatea înțelegerii (datorită prezenței multor concepte de arhitectură legate între ele) amânat studiul și aplicarea modernă ingrediente în "caseta lungă".

Articolul prezentat va fi util în primul rând de novice. În orice caz, sper că în câteva ore puteți obține o idee despre implementarea modelului MVC, care se află în centrul tuturor cadrelor web moderne și, de asemenea, să obțină "alimente" pentru o reflecție suplimentară față de " cum se face". La sfârșitul articolului, o selecție de legături utile, care va contribui, de asemenea, la a afla ce este alcătuit (în plus față de MVC) și modul în care funcționează.

Programatorii PHP situați este puțin probabil să găsească ceva nou în acest articol pentru ei înșiși, dar comentariile și comentariile lor la textul principal ar fi foarte mult! pentru că Fără teorie, practica este imposibilă și fără practică teoria este inutilă, va fi mai întâi o teorie mică și apoi ne întoarcem la practică. Dacă sunteți deja familiarizat cu conceptul MVC, puteți sări peste secțiunea cu teoria și mergeți imediat la practică.

1. Teoria

Șablonul MVC descrie o modalitate ușoară de a construi o structură de aplicare, a cărei ramură logică de afaceri de la interfața cu utilizatorul. Ca urmare, cererea este mai ușoară decât cea scalată, este testată, însoțită și, desigur, implementată.

Luați în considerare diagrama de șablon MVC conceptual (în opinia mea - aceasta este cea mai de succes schemă a celor pe care le-am văzut):

În arhitectura MVC, modelul oferă reguli de date și logică de afaceri, prezentarea este responsabilă pentru interfața cu utilizatorul, iar controlerul oferă interacțiune între model și reprezentare.

Secvența de aplicare tipică MVC poate fi descrisă după cum urmează:

  1. Când utilizatorul ajunge la resursa web, scriptul de inițializare creează o instanță a aplicației și îl pornește pentru a executa.
    Aceasta afișează aspectul, spuneți pagina principală a site-ului.
  2. Aplicația primește o solicitare de la utilizator și determină controlerul și acțiunea solicitată. În cazul paginii principale, se efectuează acțiunea implicită ( index).
  3. Aplicația creează o instanță a controlerului și începe metoda de acțiune,
    În care, de exemplu, conține apeluri model care citi informații din baza de date.
  4. După aceasta, acțiunea generează o prezentare cu datele obținute din model și afișează rezultatul utilizatorului.
Model - Conține logica de afaceri a aplicației și include metode de eșantionare (acestea pot fi metode ORM), procesarea (de exemplu, reguli de validare) și furnizarea de date specifice, care adesea o face foarte groasă, ceea ce este destul de normal.
Modelul nu trebuie să interacționeze direct cu utilizatorul. Toate variabilele legate de solicitarea utilizatorului trebuie să fie procesate în controler.
Modelul nu ar trebui să genereze un cod HTML sau un alt cod de afișare care poate varia în funcție de nevoile utilizatorului. Un astfel de cod ar trebui să fie procesat în specie.
Același model, de exemplu, modelul de autentificare a utilizatorului poate fi utilizat atât în \u200b\u200butilizator, cât și în partea administrativă a cererii. În acest caz, puteți face un cod general într-o clasă separată și ați moștenit de la acesta, determinând în metodele specifice moștenite.

Vedere - Folosit pentru a specifica afișarea externă a datelor obținute de la controler și model.
Tipurile conțin marcaj HTML și inserții de cod PHP mici la bypass, formatare și afișare a datelor.
Nu accesați direct baza de date. Acest lucru ar trebui să facă modele.
Nu lucrați cu datele obținute de la solicitarea utilizatorului. Această sarcină trebuie efectuată de către controler.
Acesta poate accesa direct proprietățile și metodele controlerului sau modelelor pentru a obține date gata la linie.
Tipurile sunt de obicei separate printr-un șablon comun care conține marcaj, comun tuturor paginilor (de exemplu, un capac și subsol) și o parte a șablonului care este utilizat pentru a afișa date din ieșirea modelului sau afișarea formularelor de introducere a datelor.

Controlor - Binder Link Conectarea modelelor, tipurile și alte componente din aplicația de lucru. Controlerul este responsabil pentru manipularea cererilor de utilizator. Controlerul nu trebuie să conțină interogări SQL. Este mai bine să le păstrați în modele. Controlerul nu trebuie să conțină HTML și alte marcaje. Merită la specii.
Într-o aplicație MVC bine concepută, controlorii sunt de obicei foarte subțiri și conțin doar câteva linii de cod de cod. Ce, nu puteți spune despre controlorii de grăsimi stupide (SFC) în CMS Joomla. Logica controlerului este destul de tipică și partea sa mare se face în clasele de bază.
Modele, dimpotrivă, foarte groase și conțin cea mai mare parte a codului asociat prelucrării datelor, deoarece Structura de date și logica de afaceri conținute în ele sunt de obicei destul de specifice unei aplicații specifice.

1.1. Controlerul frontal și controlerul de pagini

În cele mai multe cazuri, interacțiunea utilizatorului cu aplicația web trece prin link-uri prin referință. Uită-te acum la bara de adrese a browserului - pe acest link ați primit acest text. Pentru alte link-uri, de exemplu, situate pe partea dreaptă a acestei pagini, veți primi alte conținuturi. Astfel, link-ul reprezintă o comandă specifică de aplicații web.

Sper că ați observat deja că diferite site-uri pot fi perfecte formate diferite pentru construirea unui șir de adrese. Fiecare format poate afișa arhitectura aplicației web. Deși nu este întotdeauna cazul, dar în majoritatea cazurilor este un fapt evident.

Luați în considerare două opțiuni pentru bara de adrese, care prezintă un profil de text și de utilizator.

Prima opțiune:

  1. www.example.com/article.php?id\u003d3.
  2. www.example.com/user.php?id\u003d4.
Aici fiecare script este responsabil pentru efectuarea unei comenzi specifice.

A doua opțiune:

  1. www.example.com/index.php?article\u003d3.
  2. www.example.com/index.php?user\u003d4.
Și aici toate apelurile apar într-un scenariu index.php..

Abordare cu multe puncte de interacțiune Puteți viziona forumurile cu motorul phpbb. Vizualizați forumul apare prin script viewforum.php., Vizualizați subiectul prin intermediul viewtopic.php. etc. A doua abordare, cu acces printr-un fișier de script fizic, poate fi observat în modelul meu CMS MODX, unde toate apelurile trec prin index.php..

Aceste două abordări sunt complet diferite. Primul este caracteristic al șablonului de control al paginii (Controler de pagini), iar a doua abordare este implementată de modelul controlerului de interogare (controlerul frontal). Controlerul de pagini este bine folosit pentru site-uri cu logică destul de simplă. La rândul său, controlerul de solicitare combină toate acțiunile de procesare a cererilor într-un singur loc, ceea ce îi conferă caracteristici suplimentare, datorită căruia puteți implementa sarcini mai dificile decât de obicei rezolvate de controlerul paginii. Nu voi intra în detaliile implementării controlerului de pagini și voi spune doar că controlorul de interogări va fi dezvoltat în partea practică (unele asemănări).

1.2. Routing URL.

Routura URL vă permite să configurați aplicația pentru primirea solicitărilor către adresa URL care nu îndeplinesc fișierele de aplicații reale, precum și utilizarea CNC-urilor care sunt semnificative semantic pentru utilizatori și sunt preferate pentru optimizarea motorului de căutare.

De exemplu, pentru pagina obișnuită care afișează formularul de feedback, adresa URL ar putea arăta astfel:
http://www.example.com/contacts.php?action\u003dFeedback.

Codul aproximativ de procesare în acest caz:
comutator ($ _get ["acțiune"] (caz "despre": cerință_once ("aproximativ.php"); // pagina "Despre noi" Pauză; Cazul "Contacte": Necesar_once ("Contacte.php"); // pagina "Contacte" Pauză; Cauza "Feedback": Necesar ("Feedback.php"); // Pagina "Feedback" Pauză; Implicit: cerință_once ("pagina 404.php"); // pauză "404"; )
Cred că aproape toată lumea a făcut-o.

Folosind motorul de rutare URL, puteți configura cererea de primire a acestor solicitări la aceleași informații:
http://www.example.com/contacts/feedback.

Aici contactele sunt un controler, iar feedback-ul este metoda Contact Controler care reprezintă forma de feedback etc. Vom reveni la această problemă în partea practică.

De asemenea, merită să știți că multe routere cadru web vă permit să creați rute de adrese URL arbitrare (specificați ce parte a URL-ului) și regulile pentru prelucrarea acestora.
Acum avem cunoștințe teoretice suficiente pentru a merge la practică.

2. Practica

Pentru a începe, creați următoarele structuri și foldere de fișiere:

Privind înainte, voi spune că dosarul Core va stoca modelul, vizualizarea și controlerul clasei de bază.
Descendenții lor vor fi depozitați în directorii controlorilor, modelelor și vederilor. Fişier index.php. Acesta este un punct în cursul aplicației. Fişier bootstrap.php. Inițiază descărcarea aplicației prin conectarea tuturor modulelor necesare etc.

Vom merge secvențial; Deschideți fișierul index.php și completați-l cu următorul cod:
INI_SET ("display_errors", 1); Necesită "aplicație / bootstrap.php";
Nu ar trebui să existe întrebări aici.

Apoi, mergem imediat la FALU bootstrap.php.:
necesită_once "Core / model.php"; Necesită_once "Core / Vizualizare.php"; Necesită "core / controller.php"; Necesită "core / rută.php"; Traseu :: Start (); // Rulați routerul
Primele trei linii vor fi conectate până în prezent fișierele de kernel inexistente. Ultimele linii se conectează la clasa routerului și rulați-o pentru a apela metoda Startic Start.

2.1. Implementarea routerului URL

Până în prezent, voi respinge de la implementarea modelului MVC și voi lua mrachrutizarea. Primul SH este că trebuie să facem, să scrieți următorul cod în .htaccess.:
Rewriteengine pe rewritescond% (solicitare_filename)! -F rescriereCOND% (solicitare_filename)! -D rewriterule * Index.php [l]
Acest cod va redirecționa procesarea tuturor paginilor index.php.Ce ne trebuie. Amintiți-vă în prima parte. Am vorbit despre controlorul frontal?!

Rutarea noastră vom fi plasați într-un fișier separat traseu.php. În directorul de bază. În acest fișier, descriem clasa de traseu, care va rula metodele de controlere, care la rândul lor vor genera o viziune a paginilor.

Conținutul fișierului Route.php

clase de clasă ( Static. funcția Start () () // controler și acțiune implicită $ Controller_name \u003d "principal"; $ Action_name \u003d "index"; $ Rute \u003d explodează ("/", $ _server ["solicitare_uri"]); // obțineți numele controlerului Dacă (! Gol ($ rute)) ($ controller_name \u003d $ rute;) // obțineți numele acțiunii dacă (! Rule goale (Rute)) ($ action_name \u003d $ rute;) // adăugați prefixe $ model_name \u003d "model_". $ controller_name; $ Controller_name \u003d "controller_". $ Controller_name; $ Action_name \u003d "acțiune_". $ Action_name; // pungă fișierul cu clasa de clasă (este posibil ca fișierul modelului să nu fie) $ model_file \u003d strtolower ($ model_name). "PHP"; $ Model_path \u003d "Aplicație / modele /" $ model_file; Dacă (File_exists ($ model_path)) (include "aplicație / modele /" $ model_file;) // pungă fișierul cu clasa controlerului $ Controller_file \u003d Strolower ($ controller_name). "PHP"; $ Controller_path \u003d "aplicație / controlere /". $ Controller_file; dacă (File_exists ($ controller_path)) (include "aplicație / controlere /" $ controller_file; altceva ( / * Ar fi corect să aruncați o excepție aici, dar să simplificați imediat efectuați o redirecționare a paginii 404 * / Route :: ErrorPage404 (); ) // Creați un controler $ Controller \u003d noul $ controller_name; $ Action \u003d $ action_name; dacă (metoda_exists (controler $, $ acțiune)) ( // Apelați controlerul $ Controller -\u003e $ acțiune (); ) Altfel ( // ar fi mai înțelept să aruncăm o excepție Route :: ErrorPage404 (); )) funcție ErrorPage404 () ( $ Host \u003d "http: //". $ _ server ["http_host"]. "/"; Antet (http / 1.1 404 nu a fost găsit "); Antet ("Status: 404 nu a fost găsit"); Antet ("locație:". $ Gazdă. "404"); ))


Observ că o logică foarte simplificată este implementată în clasă (în ciuda codului surround) și poate chiar să aibă probleme de securitate. Sa făcut intenționând, pentru că Scrierea unei clase de rutare cu drepturi depline merită cel puțin un articol separat. Luați în considerare punctele principale ...

În elementul global de matrice $ _Server ["solicitare_uri"] conține adresa completă pentru care utilizatorul a fost adresat.
De exemplu: example.ru/contacts/feedback

Folosind o funcție exploda. Separarea adreselor este făcută. Ca rezultat, primim numele controlerului pentru exemplul de mai sus, acesta este un controler. contacte. și numele acțiunii, în cazul nostru - părere.

Apoi, fișierul model este conectat (modelul poate fi lipsit) și fișierul controlerului, dacă este și în cele din urmă este creat, este creată o instanță a controlerului și se numește o acțiune, din nou, dacă a fost descrisă în clasa controlerului .

Astfel, atunci când comutați, de exemplu, la:
example.com/portfolio.
sau
example.com/portfolio/index.
routerul efectuează următoarele:

  1. conectați fișierul model_portfolio.php din dosarul modelelor care conține clasa Model_port folio;
  2. conectați fișierul controller_portfolio.php din folderul controlerelor care cuprinde clasa controler_portfolio;
  3. creați o instanță a clasei Controller_portfolio și cauzează acțiunea implicită - Action_index descris în ea.
Dacă utilizatorul încearcă să contacteze adresa unui controler inexistent, de exemplu:
example.com/ufo.
care o va transfera la pagina "404":
example.com/404.
Același lucru se întâmplă dacă utilizatorul se transformă în acțiune care nu este descris în controler.

2.2. Reveniți la implementarea MVC

Ne întoarcem la dosarul Core și adăugăm încă trei fișiere în fișierul traseu.php: model.php, vizualizare.php și controller.php

Permiteți-mi să vă reamintesc că vor conține clase de bază, ale căror scrisori vom începe acum.

Conținutul fișierului model.php.
modelul de clasă ( Public funcția Get_Data () () } }
Clasa de clasă conține singura metodă de eșantionare a datelor goale care se va suprapune în clasele descendenților. Când creăm clase de descendenți, totul va deveni mai clar.

Conținutul fișierului view.php.
vizualizarea clasei ( // public $ template_view; // Aici puteți specifica o viziune generală a implicită. funcția generată ( $ Content_view, $ template_view, $ date \u003d null) { / * dacă (is_array ($ date)) (// transformăm elementele matricei în variabilele de extract ($ date);) * / Include "aplicație / vizualizări /". $ Template_view; ))
Nu este greu să ghiciți că metoda genera Concepute pentru a forma un tip. Următorii parametri sunt transmise:

  1. $ Content_file - tipuri de conținut de pagină care reflectă;
  2. $ template_file - șablon comun pentru toate paginile;
  3. $ Date - o matrice care conține elemente de conținut pagină. De obicei completate în model.
Funcția include este conectată dinamic de un șablon comun (vizualizare), în interiorul căruia vizualizarea va fi încorporată.
pentru a afișa un conținut specific al paginii.

În cazul nostru, șablonul general va conține antet, meniu, bara laterală și subsol, iar conținutul paginii va fi conținut într-o formă separată. Din nou, acest lucru se face pentru a simplifica.

Conținutul fișierului controller.php.
controller de clasă ( Public $ model; Public $ vedere; funcție __construct () ( $ acest -\u003e View \u003d Noua vizualizare (); ))
Metodă action_index. - Aceasta este acțiunea cauzată de neplată, o vom bloca la punerea în aplicare a claselor descendenților.

2.3. Implementarea claselor de descendenți ai modelului și a controlorului, creând o viziune "

Acum începe cele mai interesante! Cartea de vizită a site-ului nostru va consta din următoarele pagini:
  1. principalul
  2. Servicii
  3. Portofoliu.
  4. Contacte
  5. Precum și - pagina "404"
Pentru fiecare dintre pagini există propriul controler din dosarul Controlere și vizualizarea din folderul Vizualizări. Unele pagini pot utiliza un model sau un model din dosarul modelelor.

Fișierul selectat separat pe figura anterioară. templl_view.php. - Acesta este un șablon care conține marcajul general pentru toate paginile. În cel mai simplu caz, ar putea să arate așa:
<hTML LANG \u003d "RU"\u003e <head\u003e <meta Charset \u003d "UTF- 8"\u003e <titlu\u003eprincipalultitlu\u003e head\u003e <corp\u003e $ Content_view; ?\u003e corp\u003e hTML\u003e
Pentru a da site-ului vizualizării prezente, șablonul CSS se suprapune și îl integrează în site-ul nostru prin schimbarea structurii HTML Markup și conectați fișierele CSS și JavaScript:
<lINK REL \u003d "Stylesheet" Type \u003d "Text / css" href \u003d "/ css / stil.css" /\u003e <script src \u003d "/ js / jquery-1.6.2.js" tip \u003d "text / javascript"\u003escript\u003e

La sfârșitul articolului, în secțiunea "Rezultat", o referire la depozitul GitHub cu proiectul, care a fost făcut pentru a integra un șablon simplu.

2.3.1. Creați pagina principală

Să începem cu controlerul controller_main.php., Aici este codul său:
class Controller_Main extinde controlerul ( funcția action_index () ( $ acest -\u003e Vizualizare-\u003e Generare ("main_view.php", "template_view.php"); ))
În metoda genera O instanță a clasei de vizualizare este transmisă de numele fișierelor șablonului comune și de tipul conținutului paginii.
În plus față de indicele din controler, desigur, pot fi incluse alte acțiuni.

Fișierul cu o viziune comună pe care am luat-o mai devreme. Luați în considerare fișierul de conținut main_view.php.:
<h1\u003eBine ati venit!h1\u003e <p\u003e <img src \u003d "/ imagini / office-mic.jpg" align \u003d "stânga"\u003e <un href \u003d "/"\u003eEchipa Ololosh.a\u003e - Echipa de specialiști de primă clasă în dezvoltarea de site-uri web cu mulți ani de experiență care colectează măști mexicane, statui de bronz și piatră din India și Ceylon, Basoreliefs și sculpturi create de maeștrii Africii Ecuatoriale timp de cinci până acum șase secole în urmă .. .p\u003e
Acesta conține o notă simplă fără apeluri PHP.
Pentru a afișa pagina principală, puteți utiliza într-una din următoarele adrese:

  • metode de biblioteci care implementează datele de abstriciune. De exemplu, metodele bibliotecii Pear MDB2;
  • metodele ORM;
  • metode de lucru cu nosql;
  • si etc.
  • Pentru simplitate, aici nu vom folosi cereri SQL sau operatorii ORM. În schimb, luăm date reale și rambursați imediat matricea rezultată.
    Fișier model. mode_portfolio.php. Poziția în dosarul modelelor model. Iată conținutul său:
    class Model_portfolio extinde modelul ( Public funcția Get_Data () () Return Array (matrice (an "\u003d\u003e" 2012 "," site "\u003d\u003e" http://dunkelbeer.ru "," descriere "\u003d\u003e "Site-ul de promovare a berii Darkel de la producătorul german Löwenbraü produs în compania de preparare a Brewing Rusia" poate IBEV "."), Array ("An" \u003d\u003e "2012", "Site" \u003d\u003e "http://zopomobile.ru", "descriere" \u003d\u003e "Catalogul lingvistic rusesc al telefoanelor chineze de Zopo pe baza sistemului de operare android și a accesoriilor acestora".), // A FACE); ))

    Clasa controlerului modelului este conținută în fișier. controller_portfolio.php., Aici este codul său:
    class Controller_portfolio extinde controlerul ( funcție __construct () ( $ acest -\u003e modelul \u003d noul model_portfolio (); $ acest -\u003e View \u003d Noua vizualizare (); ) funcția action_index () ( $ Date \u003d $ acest -\u003e model-\u003e get_data (); $ acest -\u003e Vizualizare-\u003e Generare ("portofoliu_view.php", "template_view.php", $ date); ))
    Într-o variabilă date. Matricea returnată de metodă este înregistrată obțineți date.pe care le-am considerat mai devreme.
    Apoi, această variabilă este transmisă ca parametru de metodă. generaCare este, de asemenea, transmis: numele fișierului cu un șablon comun și numele fișierului care conține o vizualizare a conținutului paginilor.

    Vizualizarea conținutului paginii este în fișier portofoliu_view.php..

    Portofoliu.

    Toate proiectele din tabelul următor sunt fictive, deci nici măcar nu încercați să treceți prin legăturile către link-uri. " ; }


    Link către GitHub: https://github.com/vitalySwipe/tinymvc/zipball/v0.1

    Dar în această versiune am schițat următoarele clase (și corespunzătoare acestora):

    • Controller_login În care este generat o formă cu un formular pentru introducerea unei autentificări și parolă, după completarea procedurii de autentificare și, dacă este reușită, utilizatorul este redirecționat către admin.
    • Contorler_admin cu o acțiune index, în care este verificată dacă utilizatorul a fost autorizat anterior pe site ca administrator (dacă a fost, tipul de administrator este afișat) și deconectarea exercițiului pentru încălzire.
    Autentificarea și autorizația este un alt subiect, deci nu este considerat aici, dar numai o referință este dată celor de mai sus, astfel încât să fie de la ce să împingeți.

    4. Concluzie

    Șablonul MVC este folosit ca bază arhitecturală în multe cadre și CMS, care au fost create pentru a putea dezvolta decizii calitativ mai complexe pentru o perioadă mai scurtă. Acest lucru a fost posibil prin creșterea nivelului de abstractizare, deoarece există o limită a complexității structurilor care pot opera creierul uman.

    Dar, utilizarea cadrelor web, cum ar fi YII sau Kohana, formată din câteva sute de fișiere, atunci când se dezvoltă aplicații web simple (de exemplu, site-urile de vizită) nu este întotdeauna adecvată. Acum putem crea un model frumos MVC, pentru a nu amesteca codul PHP, HTML, CSS și JavaScript într-un singur fișier.

    Acest articol este mai mult ca un punct de plecare pentru studierea CMF decât un exemplu de ceva adevărat corect, care poate fi luat ca bază a aplicației dvs. web. Poate că te-a inspirat chiar și deja te gândești să scriți microfraymwork-ul sau CMS bazat pe MVC. Dar, înainte de a inventa o altă bicicletă cu "Blackjack și Sluts", gândiți-vă din nou, poate că eforturile dvs. pot fi trimise mai discutate dezvoltării și pentru a ajuta comunitatea unui proiect existent?!

    P.S.: Articolul a fost rescris ținut ținând cont de câteva comentarii rămase în comentarii. Critica sa dovedit a fi foarte utilă. Judecând după răspunsul: comentarii, apeluri într-un număr personal și număr de utilizatori au adăugat mesaje adaugă la favorite atașarea acestui post nu a fost atât de rău. Din păcate, nu este posibil să luați în considerare toate dorințele și să scrieți din ce în ce mai multe detalii pentru lipsa de timp ... dar poate că va face acele personalități misterioase care minus opțiunea inițială. Mult noroc în proiecte!

    5. O selecție de referințe utile Sabzh

    Articolul este foarte adesea afectat de subiectul cadrelor web - acesta este un subiect foarte extins, deoarece chiar și microfraymvorul constau din multe componente ale viclenilor legate între ele și nu ar fi necesar ca un articol să spună despre aceste componente. Cu toate acestea, am decis să aduc aici o mică selecție de legături (pentru care am mers atunci când scriu acest articol), care se referă cumva la tema cadrelor.

    Acest exemplu demonstrează modul de deconectare automată cu configurația implicită a securității stem.

    Pentru a vă deconecta, trebuie doar să accesați adresa URL "/ Logout" cu solicitarea POST.

    În formularul post / logout, trebuie, de asemenea, să includem tokenul CSRF, care este o protecție împotriva atacului CSRF.

    Să vedem exemplul cum să facem asta.

    Clasa de configurare Java.

    . @Configuration @enableWebsecurity @enableWebMVC @ComponentScan Class Public AppConfig Extinde WebSecurityConfiguraradApter (Configurarea Voldului protejat (HttpPpsecurity HTTP) aruncă excepția (http.authorizereQuest () autentificat () și () Formformlogin ();) Void Configurare (autentificareManagerbuilder Builder) aruncă excepția (Builder.inMemoryAuthentication () .withuser ("joe") .password ("123") .roles ("admin"); (); viewsolver.setprefix ("/ Web-Inf / Vizualizări /"); ViewResolver.setsftix ("JSP"); retur ViewResolver;))

    Rețineți că, în configurația de mai sus, suntem, de asemenea, ofițer de configurare (httppault http) pentru a omite autentificarea de bază implicită (consultați autentificarea de bază implicită (consultați codul sursă original) și utilizați autentificarea bazată pe formular. Facem acest lucru deoarece browserele cache a informațiilor de autentificare de bază agresiv (după prima autentificare de succes) și nu există nici o modalitate de a vă deconecta utilizatorul în sesiunea curentă. În majoritatea exemplelor, nu vom folosi mecanism de autentificare de bază.

    Un controler.

    @ Sontroller Clasa publică ExempluController (@Requestmapping ("/") GhidRequest2 (Harta ModelMap) (hartă.Addattribute ("timp", localdatetime.now () Totostring ()); returnați "pagina mea";))

    Pagina JSP.

    sRC / Main / WebApp / Web-Inf / Vizualizări / My-Page.Jsp

    Exemplul de securitate de primăvară

    Timp: $ (timp)



    Pentru a încerca exemple, rulați TOMCAT încorporat (configurat în Pom.xml de exemplu proiect de mai jos):

    MVN TOMCAT7: Run-război

    Ieșire.

    Accesul inițial la URI "/" va redirecționa "/ Login":

    După trimiterea numelui de utilizator și a parolei pe măsură ce configurați în clasa noastră AppConfig:

    Făcând clic pe butonul "Logout":


    Exemplu de proiect.

    Dependențe și tehnologii utilizate:

    • primăvară-securitate-Web 4.2.3.Relează: Primăvară-securitate-Web.
    • sPRIND-SECURITY-CONFIG 4.2.3 Seleaza: Config Security-Security.
    • primăvară WebMVC 4.3.9.Relează: Primăvară MVC MVC.
    • javax.servlet-API 3.1.0 Java servlet API
    • JDK 1.8.
    • Maven 3.3.9.

    Editați fișierul. uRLS.PY. Aplicații cont:

    de la adresa URL de import django.conf.urls de la. Importați vizualizări URLPATTERNS \u003d [# Anterior Login View # URL (R "^ Login / $", vizualizări.User_login, Name \u003d "Login"), # URL-ul URL de conectare / logout (R "^ Login / $", "django.contrib.auth.views.login", nume \u003d "login"), adresa URL (R "^ logout / $", "django.contrib.auth.views.logout", Name \u003d "Logout"), URL (R "^ logout-apoi-Login / $", "django.contrib.auth.views.logout_then_login", Nume \u003d "logout_then_login"),]

    Am vangajat șablonul URL pentru prezentare logare utilizator.concepute anterior pentru a utiliza prezentarea autentificare. Dzhango.

    Creați un nou director în directorul șablonului de aplicație cont Și spune-l Înregistrare. Creați un fișier nou în noul director, numiți-l login.html.

    (% Se extinde "Base.html"%) (% bloc bloc%) Log-in (% Endblock%) (% bloc bloc%)

    Autentificare

    (% dacă formularul%)

    Numele de utilizator și parola nu au meci. Încercați din nou.

    (% Alt subiect)

    Vă rugăm să utilizați formularul de mai jos pentru a vă conecta:

    (% ENDIF%) (% Block Block%)

    Acest șablon pentru intrare este foarte asemănător cu cel creat anterior. Dzhango utilizează AutentificareForm.situat în django.contrib.auth.forms.. Acest formular încearcă să verifice autenticitatea utilizatorului și generează o verificare de eroare dacă numele de utilizator nu a fost adevărat. În acest caz, putem căuta erori utilizând comanda (% dacă formularul%). Vă rugăm să rețineți că am adăugat un element ascuns. Pentru a trimite o valoare variabilă numită următorul.

    Parametru următorul Trebuie să fie o adresă URL. Dacă acest parametru este specificat, după conectarea la sistem, acesta este redirecționat către o adresă URL specificată.

    Acum creați un șablon logged_out.html. În interiorul șabloanelor de catalog Înregistrare Și introduceți următorul cod în ea:

    (% Se extinde "base.html"%) (% bloc bloc%) deconectați (% Block Block%) (% bloc de bloc%)

    Delogat.

    Ați fost înregistrat cu succes. Vă puteți conecta din nou.

    (% Block Block%)

    Acesta este un șablon care va fi afișat după conectarea utilizatorului.

    După adăugarea șabloanelor URL și șabloane pentru vizualizările de intrare și ieșire, site-ul este gata să se conecteze utilizând Autentificarea Dzhango.

    Vă rugăm să rețineți că performanța logout_then_login.incluse în noastre uRLCONF.nu are nevoie de un șablon deoarece îndeplinește redirecționarea conectați-vă..

    Acum, să creați o nouă viziune pentru a afișa panoul de monitorizare pentru ca utilizatorul să știe când utilizatorul intră în contul său. Deschide fișierul view.py. Aplicații cont Și să adăugați următorul cod:

    de la django.contrib.Ath.decorator Import login_requid @login_rection def Tabloul de bord (Cerere): Return Render (solicitare, "cont / bord.html", ("secțiunea": "tabloul de bord"))

    Adăugăm la decoratorul nostru de prezentare login_required. Cadrul de autentificare. Decorator login_required. Verifică dacă utilizatorul curent a trecut autentificarea. Dacă utilizatorul a trecut autentificarea, ropajul este executat; Dacă utilizatorul nu a trecut autentificarea, acesta va fi redirecționat către pagina de intrare.

    De asemenea, am definit o variabilă secțiune.. Vom folosi această variabilă pentru a urmări partiția site-ului, urmată de utilizator.

    Acum trebuie să creați un șablon pentru reprezentarea panoului de monitorizare. Creați un fișier nou în interiorul șabloanelor / contului Șabloane / cont / Și spune-l dashboard.html. :

    (% Se extinde "base.html"%) (% bloc bloc%) Tabloul de bord (% endblock%) (% conținutul bloc%)

    Bord.

    Bine ați venit pe tabloul de bord.

    (% Block Block%)

    Apoi adăugați următorul șablon URL la această modificare a fișierului. uRLS.PY. Aplicații cont:

    URLPatens \u003d [# ... URL (R "^ $", vizualizări.dashboard, Name \u003d "tabloul de bord"),]

    Acum editați fișierul setări.py.:

    De la django.core.urlresolvers importă reverse_lazy login_redirect_url \u003d Reverse_lazy ("tablou de bord") Login_url \u003d Reverse_lazy ("Login") Logout_url \u003d Reverse_lazy ("Logout")
    • LOGIN_REDIRECT_URL.: Raportează ce adresă URL pentru a redirecționa utilizatorul după logare în sistem.
    • Login_url. : URL-ul pentru a redirecționa utilizatorul la intrare (de exemplu, folosind decoratorul login_required.)
    • Logout_url. : URL pentru redirecționarea utilizatorului

    Acum vom adăuga la legăturile noastre de bază ale șablonului către intrarea și ieșirea de pe site.

    Pentru a face acest lucru, este necesar să se determine dacă utilizatorul curent a introdus sistemul sau nu pentru a afișa starea actuală corespunzătoare a utilizatorului, link-ul. Utilizatorul curent este setat în HttpRequest. Obiectul clasei de autentificare intermediară. Accesul la acesta poate fi obținut prin cerere.User.. Utilizatorul va fi găsit în interogare, chiar dacă utilizatorul nu a trecut autentificarea. Utilizatorul neautorizat este setat în interogare ca exemplu Anonimuser.. Cea mai bună modalitate de a verifica starea autentificării utilizatorului curent - un apel cerere.User.is_authenticat ()

    Editați șablonul Base.html.

    Cu antetul ID:

    După cum puteți vedea, meniul site-ului este afișat numai pentru utilizatorii care au trecut autentificarea. De asemenea, verificăm secțiunea curentă pentru a adăuga atributul de clasă selectat la elementul corespunzător.

  • Pentru a evidenția secțiunea curentă din meniu utilizând CSS. De asemenea, afișează numele de utilizator și link-ul pentru a vă conecta dacă utilizatorul a trecut autentificarea sau linkul pentru a vă conecta.

    Deschis în browser http://127.0.0.1:8000/account/login/. Trebuie să vedeți fluxul de intrare. Introduceți datele de conectare și parola valide. Veți vedea următoarele:

    Puteți vedea că secțiunea mea de bord este evidențiată cu CSS, deoarece are clasă selectat.. Deoarece utilizatorul a trecut autentificarea, numele de utilizator este afișat în partea dreaptă a antetului. Faceți clic pe Link. Logout.. Veți vedea următoarea pagină:

    Pe această pagină puteți vedea că utilizatorul a ieșit din sistem și, prin urmare, meniul site-ului web nu mai este afișat. Link-ul din partea dreaptă a lui Heder arată acum Autentificare.

    Dacă vedeți pagina de deconectare din site-ul de administrare Dzhango și nu propriul pagină de ieșire a sistemului, verificați setările instalate_Apps și asigurați-vă că django.contrib.admin. este după aceea cont. Ambele șabloane sunt în aceeași cale relativă, iar încărcătorul șablonului Dzhango va folosi primul găsit.

    Django vine cu o mulțime de resurse încorporate pentru cele mai frecvente cazuri de utilizare a unei aplicații web. Aplicația de înregistrare este un exemplu foarte bun și un lucru bun este că caracteristicile pot fi utilizate în afara casetei.

    Cu aplicația de înregistrare Django puteți prelua avantajele următoarelor caracteristici:

    • Autentificare.
    • Logout.
    • Inscrie-te.
    • Resetare parola.

    În acest tutorial ne vom concentra în caracteristicile de conectare și logout. Pentru resetarea înscrierii și parolei, verificați tutorialele de mai jos:

    Noțiuni de bază.

    Înainte de a începe, asigurați-vă în instalate_Apps și autentificare MiddleLled_Apps și middleware-ul de autentificare configurat corect în setările Middleware_Classes.

    Ambele vin deja configurate atunci când porniți un nou proiect Django utilizând comanda StartProject. Deci, dacă nu ați eliminat configurațiile inițiale, ar trebui să fiți configurați.

    În cazul în care începeți un nou proiect doar pentru a urma acest tutorial, creați un utilizator utilizând linia de comandă doar pentru a putea testa paginile de conectare și logout.

    $ Python gestiona.py createuperuser

    La sfârșitul acestui articol, voi furniza codul sursă al exemplului cu configurația minimă.

    Configurați rutele URL

    Importați mai întâi modulul Django.contrib.Ath.AUTH.VOES și adăugați o rută URL pentru vizualizările de conectare și logout:

    de la django.conf.urls URL de import de la django.conrib import admin de la django.contrib.Ath importă vizionări ca auth_views urlpatterns \u003d [adresa URL (R "^ Login / $", Auth_views. Login, Nume \u003d "Login"), URL ( R "^ logout / $", Auth_views. Logout, Nume \u003d "Logout"), URL (R "^ admin /", admin. URL-uri),]

    Creați un șablon de conectare

    În mod implicit, django.contrib.atth.views.login View va încerca să facă șablonul de înregistrare / login.html. Deci, configurația de bază ar crea un dosar numit registry și plasați un șablon de login.html în interior.

    După un șablon de conectare minim:

    (% Se extinde "base.html"%) (% bloc bloc%) Login (% Blocul de bloc%) (% bloc bloc%)

    Autentificare.

    (% Csrf_token%) ((Form.as_p)) (% Block Block%)

    Acest exemplu simplu validează deja numele de utilizator și parola și autentificați corect utilizatorul.

    Personalizarea vizualizării de conectare

    Există câțiva parametri pe care puteți trece la vizualizarea de autentificare pentru a vă potrivi proiectului. De exemplu, dacă doriți să stocați șablonul de conectare în altă parte decât puteți trece numele șablonului ca parametru:

    URL (R "^ Login / $", Auth_views. Login, ("template_name": "Core / LOGIN.HTML"), Name \u003d "Login"),

    De asemenea, puteți trece un formular de autentificare personalizat utilizând parametrul Autentificare_form, incase ați implementat un model de utilizator personalizat.

    Acum, o configurație foarte importantă se face în fișierul setări.py, care este URL Django va redirecționa utilizatorul după o autentificare de succes.

    În interiorul setărilor.py File Adaugă:

    LOGIN_REDIRECT_URL \u003d "HOME"

    Valoarea poate fi o adresă URL hardcode sau un nume de adrese URL. Valoarea implicită pentru LOGIN_REDIRECT_URL este / Conturi / Profil /.

    De asemenea, este important să rețineți că Django va încerca să redirecționeze utilizatorul la următorul param.

    Configurarea vizualizării deconectate

    După ce a permis django.contrib.auth.Views.logout vedere, Django va face șablonul de înregistrare / logged_out.html. În mod similar, după cum am făcut în vizualizarea de conectare, puteți trece un alt șablon ca așa:

    URL (R "^ logout / $", Auth_views. Logout, ("template_name": "logged_out.html"), nume \u003d "logout"),

    De obicei, prefer să folosesc parametrul următor_page și să redirecționeze fie la pagina de pornire a proiectului meu, fie la pagina de conectare atunci când are sens.



  • Ți-a plăcut articolul? Împărtășește-l


    AnProiectDescriere
    . "$ Rând [" an "].""$ Rând [" site "].". "$ Rând [" descriere "]."