Контакти

Звичайний logout html view. Уявлення log in і log out. Создадаем головну сторінку

Багато хто починає писати проект для роботи з єдиним завданням, не маючи на увазі, що це може вирости в розраховану на багато користувачів систему управління, ну припустимо, контентом або боронь боже, виробництвом. І все начебто здорово і класно, все працює, поки не починаєш розуміти, що той код, який написаний - складається цілком і повністю з милиць і хардкода. Код перемішаний з версткою, запитами і милицями, не піддається іноді навіть прочитання. Виникає нагальна проблема: при додаванні нових фіч, доводиться з цим кодом дуже довго і довго возитися, згадуючи «а що ж там таке написано то було?» і проклинати себе в минулому.

Ви можеть бути навіть чули про шаблони проектування і навіть гортали ці прекрасні книги:

  • Е. Гамма, Р. Хелм, Р. Джонсон, Дж. Вліссідесс «Прийоми об'єктно орієнтованого проектування. Патерни проектування »;
  • М. Фаулер «Архітектура корпоративних програмних додатків».
А багато хто, не злякавшись величезних посібників і документацій, намагалися вивчити будь-якої з сучасних фреймворків і зіткнувшись зі складністю розуміння (в силу наявності безлічі архітектруних концепцій хитро пов'язаних між собою) відклали вивчення і застосування сучасних интсрументов в «довгий ящик».

Представлена \u200b\u200bстаття буде корисна в першу чергу новачкам. У всякому разі, я сподіваюся що за пару годин ви зможете отримати уявлення про реалізацію MVC патерну, який лежить в основі всіх сучасних веб-фреймворків, а також отримати «їжу» для подальших роздумів над тим - «як варто робити». В кінці статті наводиться добірка корисних посилань, які також допоможуть розібратися з чого складаються веб-фреймворки (крім MVC) і як вони працюють.

Пропалені PHP-програмісти навряд чи знайдуть в даній статті щось нове для себе, але їх зауваження і коментарі до основного тексту були б дуже до речі! Оскільки без теорії практика неможлива, а без практики теорія марна, то спочатку буде трохи теорії, а потім перейдемо до практики. Якщо ви вже знайомі з концепцією MVC, можете пропустити розділ з теорією і відразу перейти до практики.

1. Теорія

Шаблон MVC описує простий спосіб побудови структури додатка, метою якого є відділення бізнес-логіки від призначеного для користувача інтерфейсу. В результаті, додаток легше масштабується, тестується, супроводжується і звичайно ж реалізується.

Розглянемо концептуальну схему шаблону MVC (на мій погляд - це найбільш вдала схема з тих, що я бачив):

В архітектурі MVC модель надає дані і правила бізнес-логіки, уявлення відповідає за користувальницький інтерфейс, а контролер забезпечує взаємодію між моделлю і представленням.

Типову послідовність роботи MVC-додатки можна описати таким чином:

  1. При заході користувача на веб-ресурс, скрипт ініціалізації створює екземпляр додатку і запускає його на виконання.
    При цьому відображається вид, скажімо головної сторінки сайту.
  2. Додаток отримує запит від користувача і визначає запитані контролер і дію. У разі головної сторінки, виконується дія за замовчуванням ( index).
  3. Додаток створює екземпляр контролера і запускає метод дії,
    в якому, наприклад, міститися виклики моделі, що зчитують інформацію з бази даних.
  4. Після цього, дія формує уявлення з даними, отриманими з моделі і виводить результат користувачеві.
Модель - містить бізнес-логіку додатка і включає методи вибірки (це можуть бути методи ORM), обробки (наприклад, правила валідації) і надання конкретних даних, що часто робить її дуже товстою, що цілком нормально.
Модель не повинна безпосередньо взаємодіяти з користувачем. Всі змінні, що відносяться до запиту користувача повинні оброблятися в контролері.
Модель не повинна генерувати HTML або інший код відображення, який може змінюватися в залежності від потреб користувача. Такий код повинен оброблятися в видах.
Одна і та ж модель, наприклад: модель аутентифікації користувачів може використовуватися як в призначеній для користувача, так і в адміністративній частині програми. В такому випадку можна винести загальний код в окремий клас і успадковуватися від нього, визначаючи в спадкоємців специфічні для подпріложеній методи.

вид - використовується для завдання зовнішнього відображення даних, отриманих з контролера і моделі.
Види Cодержат HTML-розмітку і невеликі вставки PHP-коду для обходу, форматування і відображення даних.
Чи не повинні безпосередньо звертатися до бази даних. Цим повинні займатися моделі.
Чи не повинні працювати з даними, отриманими із запиту користувача. Це завдання має виконувати контролер.
Може безпосередньо звертатися до властивостей і методів контролера або моделей, для отримання готових до висновку даних.
Види зазвичай поділяють на загальний шаблон, що містить розмітку, загальну для всіх сторінок (наприклад, шапку і підвал) і частини шаблону, які використовують для відображення даних, що виводяться з моделі або відображення форм введення даних.

контролер - сполучна ланка, що з'єднує моделі, види і інші компоненти в робоче додаток. Контролер відповідає за обробку запитів користувача. Контролер не повинен містити SQL-запитів. Їх краще тримати в моделях. Контролер не повинен містити HTML і інший розмітки. Її варто виносити в види.
У добре спроектованому MVC-додатку контролери зазвичай дуже тонкі і містять тільки кілька десятків рядків коду. Чого, не скажеш про Stupid Fat Controllers (SFC) в CMS Joomla. Логіка контролера досить типова і велика її частина виноситься в базові класи.
Моделі, навпаки, дуже товсті і містять велику частину коду, пов'язану з обробкою даних, тому що структура даних і бізнес-логіка, що міститься в них, зазвичай досить специфічна для конкретного додатка.

1.1. Front Controller і Page Controller

У більшості випадків, взаємодія користувача з web-додатком проходить за допомогою переходів по посиланнях. Подивіться зараз на адресний рядок браузера - за цим посиланням ви отримали цей текст. За іншими посиланнями, наприклад, що знаходяться праворуч на цій сторінці, ви отримаєте інший вміст. Таким чином, посилання представляє конкретну команду web-додатком.

Сподіваюся, ви вже встигли помітити, що у різних сайтів можуть бути вчинені різні формати побудови адресного рядка. Кожен формат може відображати архітектуру web-додатки. Хоча це і не завжди так, але в більшості випадків це явний факт.

Розглянемо два варіанти адресного рядка, за якими показується якийсь текст і профіль користувача.

Перший варіант:

  1. www.example.com/article.php?id\u003d3
  2. www.example.com/user.php?id\u003d4
Тут кожен сценарій відповідає за виконання певної команди.

Другий варіант:

  1. www.example.com/index.php?article\u003d3
  2. www.example.com/index.php?user\u003d4
А тут всі звернення відбуваються в одному сценарії index.php.

Підхід з безліччю точок взаємодії ви можете спостерігати на форумах з движком phpBB. Перегляд форуму відбувається через сценарій viewforum.php, Перегляд топіка через viewtopic.php і т.д. Другий підхід, з доступом через один фізичний файл сценарію, можна спостерігати в моїй улюбленій CMS MODX, де всі звернення проходять через index.php.

Ці два підходи абсолютно різні. Перший - характерний для шаблону контролер сторінок (Page Controller), а другий підхід реалізується патерном контролер запитів (Front Controller). Контролер сторінок добре застосовувати для сайтів з досить простою логікою. У свою чергу, контролер запитів об'єднує всі дії з обробки запитів в одному місці, що дає йому додаткові можливості, завдяки яким можна реалізувати більш складні завдання, ніж зазвичай вирішуються контролером сторінок. Я не буду вдаватися в подробиці реалізації контролера сторінок, а скажу лише, що в практичній частині буде розроблений саме контролер запитів (щось подібне до).

1.2. маршрутизація URL

Маршрутизація URL дозволяє настроїти програму на прийом запитів з URL, які не відповідають реальним файлів програми, а також використовувати ЧПУ, які семантично значимі для користувачів і переважні для пошукової оптимізації.

Наприклад, для звичайної сторінки, що відображає форму зворотного зв'язку, URL міг би виглядати так:
http://www.example.com/contacts.php?action\u003dfeedback

Приблизний код обробки в такому випадку:
switch ($ _GET [ "action"]) (case "about": require_once ( "about.php"); // сторінка "Про Нас" break; case "contacts": require_once ( "contacts.php"); // сторінка "Контакти" break; case "feedback": require_once ( "feedback.php"); // сторінка "Зворотній зв'язок" break; default: require_once ( "page404.php"); // сторінка "404" break; )
Думаю, багато хто так раніше робили.

З використанням движка маршрутизації URL ви зможете для відображення тієї ж інформації налаштувати додаток на прийом таких запитів:
http://www.example.com/contacts/feedback

Тут contacts є контролер, а feedback - це метод контролера contacts, що відображає форму зворотного зв'язку і т.д. Ми ще повернемося до цього питання в практичній частині.

Також варто знати, що маршрутизатори багатьох веб-фреймворків дозволяють створювати довільні маршрути URL (вказати, що означає кожна частина URL) і правила їх обробки.
Тепер ми володіємо достатніми теоретичними знаннями, щоб перейти до практики.

2. Практика

Для початку створимо таку структуру файлів і папок:

Забігаючи вперед, скажу, що в папці core будуть зберігатися базові класи Model, View і Controller.
Їхні нащадки будуть зберігатися в директоріях controllers, models і views. файл index.php це точка в ходу в додаток. файл bootstrap.php ініціює завантаження програми, підключаючи всі необхідні модулі та ін.

Будемо йти послідовно; відкриємо файл index.php і наповнимо його наступним кодом:
ini_set ( "display_errors", 1); require_once "application / bootstrap.php";
Тут питань виникнути не повинно.

Слідом, відразу ж перейдемо до фалу bootstrap.php:
require_once "core / model.php"; require_once "core / view.php"; require_once "core / controller.php"; require_once "core / route.php"; Route :: start (); // запускаємо маршрутизатор
Перші три рядки будуть підключати поки що неіснуючі файли ядра. Останні рядки підключають файл з класом маршрутизатора і запускають його на виконання викликом статичного методу start.

2.1. Реалізація маршрутизатора URL

Поки що відхилимося від реалізації паттерна MVC і займемося мрашрутізаціей. Перший ш аг, який нам потрібно зробити, записати наступний код в .htaccess:
RewriteEngine On RewriteCond% (REQUEST_FILENAME)! -F RewriteCond% (REQUEST_FILENAME)! -D RewriteRule. * Index.php [L]
Цей код перенаправить обробку всіх сторінок на index.php, Що нам і потрібно. Пам'ятайте в першій частині ми говорили про Front Controller ?!

Маршрутизацію ми помістимо в окремий файл route.php в директорію core. У цьому файлі опишемо клас Route, який буде запускати методи контролерів, які в свою чергу будуть генерувати вигляд сторінок.

Вміст файлу route.php

class Route ( static function start () ( // контролер і дію за замовчуванням $ Controller_name \u003d "Main"; $ Action_name \u003d "index"; $ Routes \u003d explode ( "/", $ _SERVER [ "REQUEST_URI"]); // отримуємо ім'я контролера if (! empty ($ routes)) ($ controller_name \u003d $ routes;) // отримуємо ім'я екшену if (! empty ($ routes)) ($ action_name \u003d $ routes;) // додаємо префікси $ Model_name \u003d "Model_". $ Controller_name; $ Controller_name \u003d "Controller_". $ Controller_name; $ Action_name \u003d "action_". $ Action_name; // підчіплюємо файл з класом моделі (файлу моделі може і не бути) $ Model_file \u003d strtolower ($ model_name). ". Php"; $ Model_path \u003d "application / models /". $ Model_file; if (file_exists ($ model_path)) (include "application / models /". $ model_file;) // підчіплюємо файл з класом контролера $ Controller_file \u003d strtolower ($ controller_name). ". Php"; $ Controller_path \u003d "application / controllers /". $ Controller_file; if (file_exists ($ controller_path)) (include "application / controllers /". $ controller_file;) else ( / * Правильно було б кинути тут виняток, але для спрощення відразу зробимо редирект на сторінку 404 * / Route :: ErrorPage404 (); ) // створюємо контролер $ Controller \u003d new $ controller_name; $ Action \u003d $ action_name; if (method_exists ($ controller, $ action)) ( // викликаємо дію контролера $ Controller -\u003e $ action (); ) Else ( // тут також розумніше було б кинути виняток Route :: ErrorPage404 (); )) function ErrorPage404 () ( $ Host \u003d "http: //". $ _ SERVER [ "HTTP_HOST"]. "/"; header ( "HTTP / 1.1 404 Not Found"); header ( "Status: 404 Not Found"); header ( "Location:". $ host. "404"); ))


Зауважу, що в класі реалізована дуже спрощена логіка (незважаючи на об'ємний код) і можливо навіть має проблеми безпеки. Це було зроблено навмисно, тому що написання повноцінного класу маршрутизації заслуговує як мінімум окремої статті. Розглянемо основні моменти ...

В елементі глобального масиву $ _SERVER [ "REQUEST_URI"] міститься повна адреса за яким звернувся користувач.
Наприклад: example.ru/contacts/feedback

За допомогою функції explode проводиться поділ адреси на составлющіе. В результаті ми отримуємо ім'я контролера, для наведеного прикладу, це контролер contacts і ім'я дії, в нашому випадку - feedback.

Далі підключається файл моделі (модель може бути відсутнім) і файл контролера, якщо такі є і нарешті, створюється екземпляр контролера і викликається дію, знову ж таки, якщо воно було описано в класі контролера.

Таким чином, при переході, наприклад, за адресою:
example.com/portfolio
або
example.com/portfolio/index
роутер виконає такі завдання:

  1. підключить файл model_portfolio.php з папки models, що містить клас Model_Portfolio;
  2. підключить файл controller_portfolio.php з папки controllers, що містить клас Controller_Portfolio;
  3. створить екземпляр класу Controller_Portfolio і викличе дію за замовчуванням - action_index, описане в ньому.
Якщо користувач спробує звернутися за адресою неіснуючого контролера, наприклад:
example.com/ufo
то його перекине на сторінку «404»:
example.com/404
Те ж саме відбудеться якщо користувач звернеться до дії, яке не описано в контролері.

2.2. Повертаємося до реалізації MVC

Перейдемо в папку core і додамо до файлу route.php ще три файли: model.php, view.php і controller.php

Нагадаю, що вони будуть містити базові класи, до написання яких ми зараз і приступимо.

вміст файлу model.php
class Model ( public function get_data () ( } }
Клас моделі містить єдиний порожній метод вибірки даних, який буде перекриватися в класах нащадках. Коли ми будемо створювати класи нащадки все стане зрозуміліше.

вміст файлу view.php
class View ( // public $ template_view; // тут можна вказати загальний вигляд за замовчуванням. function generate ( $ Content_view, $ template_view, $ data \u003d null) { / * If (is_array ($ data)) (// перетворимо елементи масиву в змінні extract ($ data);) * / include "application / views /". $ template_view; ))
Не важко здогадатися, що метод generate призначений для формування образу. У нього передаються такі параметри:

  1. $ Content_file - види відображають контент сторінок;
  2. $ Template_file - загальний для всіх сторінок шаблон;
  3. $ Data - масив, що містить елементи контенту сторінки. Звичайно заповнюється в моделі.
Функцією include динамічно підключається загальний шаблон (вид), всередині якого буде вбудовуватися вид
для відображення контенту конкретної сторінки.

У нашому випадку загальний шаблон буде містити header, menu, sidebar і footer, а контент сторінок буде міститися в окремому вигляді. Знову ж це зроблено для спрощення.

вміст файлу controller.php
class Controller ( public $ model; public $ view; function __construct () ( $ This -\u003e view \u003d new View (); )))
метод action_index - це дія, що викликається за замовчуванням, його ми перекриємо при реалізації класів нащадків.

2.3. Реалізація класів нащадків Model і Controller, створення View "s

Тепер починається найцікавіше! Наш сайт-візитка буде складатися з следущих сторінок:
  1. Головна
  2. послуги
  3. Портфоліо
  4. Контакти
  5. А також - сторінка «404»
Для кожної зі сторінок є свій контролер з папки controllers і вид з папки views. Деякі сторінки можуть використовувати модель або моделі з папки models.

На попередньому малюнку окремо виділений файл template_view.php - це шаблон, який містить загальну для всіх сторінок розмітку. У найпростішому випадку він міг би виглядати так:
<html lang \u003d "ru"\u003e <head\u003e <meta charset \u003d "utf- 8"\u003e <title\u003eГоловнаtitle\u003e head\u003e <body\u003e $ Content_view; ?\u003e body\u003e html\u003e
Для додання сайту презентабельного вигляду зверстаємо CSS шаблон і інтегріріруем його в наш сайт шляхом зміни структури HTML-розмітки і підключення CSS і JavaScript файлів:
<link rel \u003d "stylesheet" type \u003d "text / css" href \u003d "/ css / style.css" /\u003e <script src \u003d "/ js / jquery-1.6.2.js" type \u003d "text / javascript"\u003escript\u003e

В кінці статті, в розділі «Результат», наводиться посилання на GitHub-репозиторій з проектом, в якому виконані дії по інтеграції простенького шаблону.

2.3.1. Создадаем головну сторінку

Почнемо з контролера controller_main.php, Ось його код:
class Controller_Main extends Controller ( function action_index () ( $ This -\u003e view-\u003e generate ( "main_view.php", "template_view.php"); ))
У метод generate примірника класу View передаються імена файлів загального шаблону і виду c контентом сторінки.
Крім індексного дії в контролері звичайно ж можуть міститися і інші дії.

Файл із загальним видом ми розглянули раніше. Розглянемо файл контенту main_view.php:
<h1\u003eЛаскаво просимо!h1\u003e <p\u003e <img src \u003d "/ images / office-small.jpg" align \u003d "left"\u003e <a href \u003d "/"\u003eОЛОЛОША TEAMa\u003e - команда першокласних фахівців в області розробки веб-сайтів з багаторічним досвідом колекціонування мексиканських масок, бронзові і кам'яні статуї з Індії та Цейлону, барельєфів і статуй, створених майстрами Екваторіальної Африки п'ять-шість століть тому ...p\u003e
Тут міститься проста розмітка без будь-яких PHP-викликів.
Для відображення головної сторінки можна скористатися одним з наступних адрес:

  • методи бібліотек, що реалізують абстракіцю даних. Наприклад, методи бібліотеки PEAR MDB2;
  • методи ORM;
  • методи для роботи з NoSQL;
  • та ін.
  • Для простоти, тут ми не будемо використовувати SQL-запити або ORM-оператори. Замість цього ми семуліруем реальні дані і відразу повернемо масив результатів.
    файл моделі model_portfolio.php помістимо в папку models. Ось його зміст:
    class Model_Portfolio extends Model ( public function get_data () ( return array (array ( "Year" \u003d\u003e "2012", "Site" \u003d\u003e "http://DunkelBeer.ru", "Description" \u003d\u003e "Промо-сайт темного пива Dunkel від німецького виробника Löwenbraü випускається в Росії пивоварною компанією" CАН ІнБев "."), Array ( "Year" \u003d\u003e "2012", "Site" \u003d\u003e "http://ZopoMobile.ru", "Description" \u003d\u003e "Російськомовний каталог китайських телефонів компанії Zopo на базі Android OS і аксесуарів до них."), // todo); ))

    Клас контролера моделі міститься в файлі controller_portfolio.php, Ось його код:
    class Controller_Portfolio extends Controller ( function __construct () ( $ This -\u003e model \u003d new Model_Portfolio (); $ This -\u003e view \u003d new View (); ) function action_index () ( $ Data \u003d $ this -\u003e model-\u003e get_data (); $ This -\u003e view-\u003e generate ( "portfolio_view.php", "template_view.php", $ data); ))
    У змінну data записується масив, що повертається методом get_data, Який ми розглядали раніше.
    Далі ця змінна передається як параметр методу generate, В який також передаються: ім'я файлу з загальним шаблон і ім'я файлу, що містить вид c контентом сторінки.

    Вид містить контент сторінки знаходиться в файлі portfolio_view.php.

    Портфоліо

    Всі проекти в наступній таблиці є вигаданими, тому навіть не намагайтеся перейти за наведеними посиланнями. " ; }


    Посилання на GitHub: https://github.com/vitalyswipe/tinymvc/zipball/v0.1

    А ось в цій версії я накидав наступні класи (і відповідні їм види):

    • Controller_Login в якому генерується вид з формою для введення логіна і пароля, після заповнення якої виробляється процедура аутентифікації і в разі успіху користувач перенаправляється в адмінку.
    • Contorller_Admin з індексним дією, в якому перевіряється був чи користувач раніше авторизований на сайті як адміністратор (якщо був, то відображається вид адмінки) і дією logout для разлогініванія.
    Аутентифікація і авторизація - це інша тема, тому тут вона не розглядається, а лише наводиться посилання зазначена вище, щоб було від чого відштовхнутися.

    4. Висновок

    Шаблон MVC використовується в якості архітектурної основи в багатьох фреймворками і CMS, які створювалися для того, щоб мати можливість розробляти якісно більш складні рішення за більш короткий термін. Це стало можливим завдяки підвищенню рівня абстракції, оскільки є межа складності конструкцій, якими може оперувати людський мозок.

    Але, використання веб-фреймворків, типу Yii або Kohana, що складаються з декількох сотень файлів, при розробці простих веб-додатків (наприклад, сайтів-візіткок) не завжди доцільно. Тепер ми вміємо створювати красиву MVC модель, щоб не перемішувати Php, Html, CSS і JavaScript код в одному файлі.

    Дана стаття є скоріше відправною точкою для вивчення CMF, ніж прикладом чогось істинно правильного, що можна взяти за основу свого веб-додатки. Можливо вона навіть надихнула Вас і ви вже подумує написати свій мікрофреймворк або CMS, засновані на MVC. Але, перш ніж винаходити черговий велосипед з «блекджек і повіями», ще раз подумайте, може ваші зусилля розумніше направити на розвиток і в допомогу спільноті вже існуючого проекту ?!

    P.S .: Стаття була переписана з урахуванням деяких зауважень, надісланих в коментарях. Критика виявилася дуже корисною. Судячи по відгуку: коментарів, зверненнями в личку і кількості користувачів додали пост в обране затія написати цей пост виявилося не такий вже поганий. На жаль, не можливо врахувати всі побажання і написати більше і докладніше через брак часу ... але можливо це зроблять ті таємничі особистості, хто мінусувати початковий варіант. Удачі в проектах!

    5. Підбірка корисних посилань по сабжу

    У статті дуже часто порушується тема веб-фреймворків - це дуже велика тема, тому що навіть мікрофреймворкі складаються з багатьох компонентів хитро пов'язаних між собою і потрібна була б не одна стаття, щоб розповісти про ці компонентах. Проте, я вирішив навести тут невелику добірку посилань (за якими я ходив при написанні цієї статті), які так чи інакше стосуються теми фреймворків.

    This example demonstrates how to automatically logout with default Spring security configuration.

    To logout, we just need to access URL "/ logout" with POST request.

    In the POST / logout form, we also need to include the CSRF token, which is a protection against CSRF attack.

    Let "s see the example how to do that.

    Java Config class

    @Configuration @EnableWebSecurity @EnableWebMvc @ComponentScan public class AppConfig extends WebSecurityConfigurerAdapter (protected void configure (HttpSecurity http) throws Exception (http.authorizeRequests () .anyRequest (). Authenticated () .and () .formLogin ();) @Override public void configure (AuthenticationManagerBuilder builder) throws Exception (builder.inMemoryAuthentication () .withUser ( "joe") .password ( "123") .roles ( "ADMIN");) @Bean public viewResolver viewResolver () (InternalResourceViewResolver viewResolver \u003d new InternalResourceViewResolver (); viewResolver.setPrefix ( "/ WEB-INF / views /"); viewResolver.setSuffix ( ". jsp"); return viewResolver;))

    Note that, in above configuration, we are also overriding configure (HttpSecurity http) to omit the default Basic Authentication (see the original method in WebSecurityConfigurerAdapter source code) and use form based Authentication. We are doing so because browsers cache the Basic Authentication information aggressively (after the first successful login) and there is no way to logout the user in the current session. In most of the examples, we will not be using Basic Authentication mechanism.

    A controller

    @Controller public class ExampleController (@RequestMapping ( "/") public String handleRequest2 (ModelMap map) (map.addAttribute ( "time", LocalDateTime.now (). ToString ()); return "my-page";))

    The JSP page

    src / main / webapp / WEB-INF / views / my-page.jsp

    Spring Security Example

    Time: $ (time)



    To try examples, run embedded tomcat (configured in pom.xml of example project below):

    Mvn tomcat7: run-war

    Output

    Initial access to URI "/" will redirect to "/ login":

    After submitting user name and password as we setup in our AppConfig class:

    Clicking on "Logout" button:


    Example Project

    Dependencies and Technologies Used:

    • 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: Spring Web MVC.
    • javax.servlet-api 3.1.0 Java Servlet API
    • JDK 1.8
    • Maven 3.3.9

    відредагуйте файл urls.py додатки account:

    from django.conf.urls import url from. import views urlpatterns \u003d [# previous login view # Url (r "^ login / $", views.user_login, name \u003d "login"), # Login / logout urls url (r "^ login / $", "Django.contrib.auth.views.login", Name \u003d "login"), url (r "^ logout / $", "Django.contrib.auth.views.logout", Name \u003d "logout"), url (r "^ logout-then-login / $", "Django.contrib.auth.views.logout_then_login", Name \u003d "logout_then_login"),]

    Ми заккоментіровалі шаблон URL-адреси для подання user_login, Створеного раніше для використання уявлення login Джанго.

    Створіть новий каталог в каталозі шаблонів додатки account і назвіть його registration. Створіть новий файл в новому каталозі, назвіть його login.html

    (% Extends "base.html"%) (% block title%) Log-in (% endblock%) (% block content%)

    Log-in

    (% If form.errors%)

    Your username and password didn "t match. Please try again.

    (% Else%)

    Please, use the following form to log-in:

    (% Endif%) (% Endblock%)

    Цей шаблон для входу дуже схожий на створений раніше. Джанго використовує AuthenticationForm, Розташовану в django.contrib.auth.forms. Ця форма намагається перевірити справжність користувача і породжує помилку перевірки, якщо ім'я користувача було не вірно. У цьому випадку ми можемо шукати помилки за допомогою команди (% if form.errors%). Зверніть увагу, що ми додали прихований елемент для відправки значення змінної з ім'ям next.

    параметр next повинен бути URL-адресою. Якщо цей параметр вказаний, то після входу користувача в систему він перенаправляється на заданий URL-адресу.

    Тепер створіть шаблон logged_out.html всередині каталогу шаблону registration і вставте в нього наступний код:

    (% Extends "base.html"%) (% block title%) Logged out (% endblock%) (% block content%)

    Logged out

    You have been successfully logged out. You can log-in again.

    (% Endblock%)

    Це шаблон, який буде відображатися після входу користувача в систему.

    Після додавання шаблонів URL-адрес і шаблонів для вхідних і вихідних уявлень сайт готовий до входу в систему з використанням уявлень аутентифікації Джанго.

    Зверніть увагу, що подання logout_then_login, Включене в наш urlconf, Не потребує шаблоні, оскільки він виконує перенаправлення на log in view.

    Тепер створимо новий view для відображення панелі моніторингу для користувача, щоб знати коли користувач увійде в свій обліковий запис. Відкрийте файл views.py додатки account і додайте в нього наступний код:

    from django.contrib.auth.decorators import login_required @login_required def dashboard (request): return render (request, "account / dashboard.html", ( "section": "dashboard"))

    Ми додаємо в наше уявлення декоратор login_required authentication framework. декоратор login_required перевіряє, чи пройшов поточний користувач аутентифікацію. Якщо користувач пройшов аутентифікацію, рпедставленіе виконається; Якщо користувач не пройшов аутентифікацію, він буде перенаправляти на сторінку входу.

    Ми також визначили змінну section. Ми збираємося використовувати цю змінну для відстеження того розділу сайту, за яким спостерігає користувач.

    Тепер необхідно створити шаблон для подання панелі моніторингу. Створіть новий файл всередині шаблонів / облікової templates / account / і назвіть його dashboard.html :

    (% Extends "base.html"%) (% block title%) Dashboard (% endblock%) (% block content%)

    Dashboard

    Welcome to your dashboard.

    (% Endblock%)

    Потім додайте наступний шаблон URL-адреси для цього змініть файл urls.py додатки account:

    Urlpatterns \u003d [# ... url (r "^ $", views.dashboard, name \u003d "dashboard"),]

    Тепер необхідно відредагувати файл settings.py:

    from django.core.urlresolvers import reverse_lazy LOGIN_REDIRECT_URL \u003d reverse_lazy ( "dashboard") LOGIN_URL \u003d reverse_lazy ( "login") LOGOUT_URL \u003d reverse_lazy ( "logout")
    • LOGIN_REDIRECT_URL: Повідомляє про те, на який URL-адресу перенаправляти користувача після входу в систему.
    • LOGIN_URL : URL-адресу для перенаправлення користувача на вхід (наприклад, за допомогою декоратора login_required)
    • LOGOUT_URL : URL-адресу для перенаправлення користувача на вихід

    Тепер ми збираємося додати до нашого базового шаблоном посилання на вхід і вихід з сайту.

    Для цього необхідно визначити, увійшов чи поточний користувач в систему чи ні, щоб отримати приблизну поточному стану користувача, посилання. Поточний користувач задається в HttpRequest об'єкті проміжного класу authentication. Доступ до нього можна отримати за допомогою request.user. У запиті буде знайдений об'єкт user, навіть якщо user не пройшов аутентифікацію. Нерозпізнаних користувачів, задається в запиті як примірника AnonymousUser. Найкращий спосіб перевірки стану аутентифікації поточного користувача - виклик request.user.is_authenticated ()

    Відредагуйте в шаблоні base.html

    з ID header:

    Як можна бачити, меню сайту відображається тільки для користувачів, які пройшли аутентифікації. Ми також перевіряємо поточний розділ, щоб додати вибраний атрибут класу до відповідного елементу

  • , Щоб виділити поточний розділ в меню за допомогою CSS. Також відображається ім'я користувача і посилання для виходу в систему, якщо користувач пройшов аутентифікацію, або посилання для входу в систему.

    Відкрийте в браузері http://127.0.0.1:8000/account/login/. Ви повинні побачити стрініцу входу. Введіть валідний логін і пароль. Ви побачите наступне:

    Можна побачити, що розділ My dashboard виділений за допомогою CSS, так як він має class selected. Оскільки користувач пройшов аутентифікацію, ім'я користувача відображається в правій частині header-а. клацніть посилання Logout. Ви побачите наступну сторінку:

    На цій сторінці можна побачити, що користувач вийшов із системи, і тому більше не відображається меню веб-сайту. Посилання в правій стороні хедера показує тепер Log-in.

    Якщо ви бачите сторінку log out з сайту адміністрування Джанго, а не власну сторінку виходу з системи, перевірте настройки INSTALLED_APPS і переконайтеся, що django.contrib.admin знаходиться після account. Обидва шаблону знаходяться в тому ж відносному шляху, і завантажувач шаблону Джанго буде використовувати перший знайдений.

    Django comes with a lot of built-in resources for the most common use cases of a Web application. The registration app is a very good example and a good thing about it is that the features can be used out-of-the-box.

    With the Django registration app you can take advantages of the following features:

    • Login
    • Logout
    • Sign up
    • Password reset

    In this tutorial we will focus in the Login and Logout features. For sign up and password reset, check the tutorials below:

    Getting started

    Before we start, make sure you have django.contrib.auth in your INSTALLED_APPS and the authentication middleware properly configured in the MIDDLEWARE_CLASSES settings.

    Both come already configured when you start a new Django project using the command startproject. So if you did not remove the initial configurations you should be all set up.

    In case you are starting a new project just to follow this tutorial, create a user using the command line just so we can test the login and logout pages.

    $ Python manage.py createsuperuser

    In the end of this article I will provide the source code of the example with the minimal configuration.

    Configure the URL routes

    First import the django.contrib.auth.views module and add a URL route for the login and logout views:

    from django.conf.urls import url from django.contrib import admin from django.contrib.auth import views as auth_views urlpatterns \u003d [url (r "^ login / $", auth_views. login, name \u003d "login"), url ( r "^ logout / $", auth_views. logout, name \u003d "logout"), url (r "^ admin /", admin. site. urls),]

    Create a login template

    By default, the django.contrib.auth.views.login view will try to render the registration / login.html template. So the basic configuration would be creating a folder named registration and place a login.html template inside.

    Following a minimal login template:

    (% Extends "base.html"%) (% block title%) Login (% endblock%) (% block content%)

    Login

    (% Csrf_token%) ((form.as_p)) (% Endblock%)

    This simple example already validates username and password and authenticate correctly the user.

    Customizing the login view

    There are a few parameters you can pass to the login view to make it fit your project. For example, if you want to store your login template somewhere else than registration / login.html you can pass the template name as a parameter:

    url (r "^ login / $", auth_views. login, ( "template_name": "core / login.html"), name \u003d "login"),

    You can also pass a custom authentication form using the parameter authentication_form, incase you have implemented a custom user model.

    Now, a very important configuration is done in the settings.py file, which is the URL Django will redirect the user after a successful authentication.

    Inside the settings.py file add:

    LOGIN_REDIRECT_URL \u003d "home"

    The value can be a hardcoded URL or a URL name. The default value for LOGIN_REDIRECT_URL is / accounts / profile /.

    It is also important to note that Django will try to redirect the user to the next GET param.

    Setting up logout view

    After acessing the django.contrib.auth.views.logout view, Django will render the registration / logged_out.html template. In a similar way as we did in the login view, you can pass a different template like so:

    url (r "^ logout / $", auth_views. logout, ( "template_name": "logged_out.html"), name \u003d "logout"),

    Usually I prefer to use the next_page parameter and redirect either to the homepage of my project or to the login page when it makes sense.



  • Сподобалася стаття? поділіться їй


    рікпроектопис
    ". $ Row [" Year "]."". $ Row [" Site "]."". $ Row [" Description "]."