Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00138 004801 19012642 na godz. na dobę w sumie
Django 2. Praktyczne tworzenie aplikacji sieciowych. Wydanie II - książka
Django 2. Praktyczne tworzenie aplikacji sieciowych. Wydanie II - książka
Autor: Liczba stron: 440
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-5551-4 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> python - programowanie
Porównaj ceny (książka, ebook (-35%), audiobook).

Django jest frameworkiem do budowy profesjonalnych aplikacji sieciowych w języku Python. Cieszy się zasłużoną opinią potężnego narzędzia, którego można się szybko nauczyć. Spodoba się każdemu, kto ceni prostotę użytkowania i pragmatyczne podejście do projektowania. Z pewnością Django jest atrakcyjnym rozwiązaniem dla programistów, którzy profesjonalnie podchodzą do tworzenia aplikacji WWW i stawiają na niezawodność.

To drugie, zaktualizowane i uzupełnione wydanie cenionego podręcznika pisania aplikacji sieciowych w Django. Krok po kroku pokazano w nim pełny proces tworzenia oprogramowania, od pierwszych linii kodu po wdrożenie, z akcentem na praktyczną stronę pracy dewelopera. Nie tylko zaprezentowano technikę pracy z frameworkiem, ale też opisano zasady integrowania innych popularnych technologii z projektami Django. Książka pozwala również zapoznać się z metodami rozwiązywania typowych problemów z implementacją, a także - w sposób naturalny, niejako mimochodem - nauczyć się najlepszych praktyk programistycznych z wykorzystaniem łatwych do powielenia procedur.

Najważniejsze zagadnienia omówione w książce:

Django - dla tych, którzy chcą mieć świetne wyniki!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Django 2 by Example Tłumaczenie: Radosław Meryk ISBN: 978-83-283-5551-4 Copyright © Packt Publishing 2018. First published in the English language under the title ‘Django 2 by Example – (9781788472487)’ Polish edition copyright © 2019 by Helion SA All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Helion SA dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Helion SA nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Helion SA ul. Kościuszki 1c, 44-100 Gliwice tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/djpta2.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/djpta2 Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treści O autorze O recenzentach Przedmowa Rozdział 1. Utworzenie aplikacji bloga Instalacja Django Utworzenie odizolowanego środowiska Pythona Instalowanie Django za pomocą pip Tworzenie pierwszego projektu Uruchamianie serwera programistycznego Ustawienia projektu Projekty i aplikacje Utworzenie aplikacji Projekt schematu danych dla bloga Aktywacja aplikacji Tworzenie i stosowanie migracji Tworzenie witryny administracyjnej dla modeli Tworzenie superużytkownika Witryna administracyjna Django Dodawanie modeli do witryny administracyjnej Personalizacja sposobu wyświetlania modeli Praca z obiektami QuerySet i menedżerami Tworzenie obiektów Aktualizowanie obiektów Pobieranie obiektów Usunięcie obiektu Kiedy następuje określenie zawartości kolekcji QuerySet? Utworzenie menedżerów modelu 11 12 13 17 17 18 19 20 21 23 24 24 25 27 27 29 29 29 30 32 34 34 35 35 37 37 37 Poleć książkęKup książkę Spis treści Przygotowanie widoków listy i szczegółów Utworzenie widoków listy i szczegółów Dodanie wzorców adresów URL do widoków Kanoniczne adresy URL dla modeli Utworzenie szablonów dla widoków Dodanie stronicowania Użycie widoków opartych na klasach Podsumowanie Rozdział 2. Usprawnienie bloga za pomocą funkcji zaawansowanych Współdzielenie postów przy użyciu wiadomości e-mail Tworzenie formularzy w Django Obsługa formularzy w widokach Wysyłanie wiadomości e-mail w Django Generowanie formularza w szablonie Utworzenie systemu komentarzy Utworzenie formularza na podstawie modelu Obsługa klasy ModelForm w widoku Dodanie komentarzy do szablonu szczegółów posta Dodanie funkcjonalności tagów Pobieranie podobnych postów Podsumowanie Rozdział 3. Rozbudowa aplikacji bloga Utworzenie własnych filtrów i znaczników szablonu Utworzenie własnych znaczników szablonu Utworzenie własnych filtrów szablonu Dodanie mapy witryny Utworzenie kanału wiadomości dla postów bloga Dodanie do bloga wyszukiwania pełnotekstowego Instalacja PostgreSQL Proste wyszukiwania Wyszukiwanie w wielu polach Utworzenie widoku wyszukiwania Stemming i ranking wyników Wagi zapytań Wyszukiwanie z podobieństwem trygramu Inne silniki wyszukiwania pełnotekstowego Podsumowanie Rozdział 4. Utworzenie witryny społecznościowej Utworzenie projektu witryny społecznościowej Rozpoczęcie pracy nad aplikacją społecznościową Użycie frameworka uwierzytelniania w Django Utworzenie widoku logowania Użycie widoków uwierzytelniania w Django Widoki logowania i wylogowania Widoki zmiany hasła Widoki zerowania hasła 6 38 38 39 41 41 45 47 48 49 49 50 51 52 55 58 60 60 62 65 70 72 75 75 76 80 82 85 87 88 89 90 90 92 93 94 95 95 97 97 98 99 100 105 105 110 112 Poleć książkęKup książkę Spis treści Rejestracja użytkownika i profile użytkownika Rejestracja użytkownika Rozbudowa modelu User Użycie własnego modelu User Użycie frameworka komunikatów Implementacja własnego mechanizmu uwierzytelniania Dodanie do witryny uwierzytelnienia za pomocą innej witryny społecznościowej Uwierzytelnienie za pomocą serwisu Facebook Uwierzytelnienie za pomocą serwisu Twitter Uwierzytelnienie za pomocą serwisu Google Podsumowanie Rozdział 5. Udostępnianie treści w witrynie internetowej Utworzenie witryny internetowej do kolekcjonowania obrazów Utworzenie modelu Image Zdefiniowanie relacji typu „wiele do wielu” Rejestracja modelu Image w witrynie administracyjnej Umieszczanie treści pochodzącej z innych witryn internetowych Usunięcie zawartości pól formularza Nadpisanie metody save() egzemplarza ModelForm Utworzenie bookmarkletu za pomocą jQuery Utworzenie widoku szczegółowego obrazu Utworzenie miniatury za pomocą sorl-thumbnail Dodanie akcji AJAX za pomocą jQuery Wczytanie jQuery CSRF w żądaniach AJAX Wykonywanie żądań AJAX za pomocą jQuery Utworzenie własnego dekoratora dla widoków Dodanie stronicowania AJAX do widoków listy Podsumowanie Rozdział 6. Śledzenie działań użytkownika Utworzenie systemu obserwacji Utworzenie relacji typu „wiele do wielu” za pomocą modelu pośredniego Utworzenie widoków listy i szczegółowego dla profilu użytkownika Utworzenie widoku AJAX pozwalającego na obserwację użytkowników Budowa ogólnego strumienia aktywności aplikacji Użycie frameworka contenttypes Dodanie do modelu relacji generycznych Uniknięcie powielonych akcji w strumieniu aktywności Dodanie akcji użytkownika do strumienia aktywności Wyświetlanie strumienia aktywności Optymalizacja kolekcji QuerySet dotyczącej powiązanych obiektów Tworzenie szablonów dla akcji Użycie sygnałów dla denormalizowanych zliczeń Praca z sygnałami Definiowanie klas konfiguracyjnych aplikacji 117 117 120 126 126 128 130 132 136 138 142 143 144 144 146 146 147 148 148 152 160 162 163 165 166 167 170 171 175 177 177 178 181 184 187 188 189 192 193 194 194 196 197 198 200 7 Poleć książkęKup książkę Spis treści Użycie bazy danych Redis do przechowywania różnych elementów widoków Instalacja bazy danych Redis Użycie bazy danych Redis z Pythonem Przechowywanie różnych elementów widoków w bazie danych Redis Przechowywanie rankingu w bazie danych Redis Kolejne kroki z bazą danych Redis Podsumowanie Rozdział 7. Utworzenie sklepu internetowego Utworzenie projektu sklepu internetowego Utworzenie modeli katalogu produktów Rejestracja modeli katalogu w witrynie administracyjnej Utworzenie widoków katalogu Utworzenie szablonów katalogu Utworzenie koszyka na zakupy Użycie sesji Django Ustawienia sesji Wygaśnięcie sesji Przechowywanie koszyka na zakupy w sesji Utworzenie widoków koszyka na zakupy Utworzenie procesora kontekstu dla bieżącego koszyka na zakupy Rejestracja zamówień klienta Utworzenie modeli zamówienia Dołączenie modeli zamówienia w witrynie administracyjnej Utworzenie zamówień klienta Wykonywanie zadań asynchronicznych za pomocą Celery Instalacja Celery Instalacja RabbitMQ Dodanie Celery do projektu Dodawanie do aplikacji zadań asynchronicznych Monitorowanie Celery Podsumowanie Rozdział 8. Zarządzanie płatnościami i zamówieniami Integracja bramki płatności Tworzenie konta sandbox serwisu Braintree Instalowanie modułu Pythona Braintree Integracja bramki płatności Testowanie płatności Wdrożenie do produkcji Eksport zamówienia do pliku CSV Dodanie własnych akcji do witryny administracyjnej Rozbudowa witryny administracyjnej za pomocą własnych widoków Dynamiczne generowanie rachunków w formacie PDF Instalacja WeasyPrint Utworzenie szablonu PDF Generowanie pliku w formacie PDF Wysyłanie dokumentów PDF za pomocą wiadomości e-mail Podsumowanie 8 202 202 204 205 206 208 209 211 211 212 214 215 217 221 222 223 224 224 228 234 237 237 239 240 244 244 244 245 246 248 248 249 249 250 251 252 259 261 261 262 264 268 269 269 270 273 274 Poleć książkęKup książkę Rozdział 9. Rozbudowa sklepu internetowego Utworzenie systemu kuponów Utworzenie modeli kuponu Zastosowanie kuponu w koszyku na zakupy Zastosowanie kuponu w zamówieniu Internacjonalizacja i lokalizacja projektu Internacjonalizacja za pomocą Django Przygotowanie projektu do internacjonalizacji Tłumaczenie kodu Pythona Tłumaczenie szablonów Użycie interfejsu do tłumaczeń o nazwie Rosetta Opcja fuzzy Wzorce adresów URL dla internacjonalizacji Umożliwienie użytkownikowi zmiany języka Tłumaczenie modeli za pomocą django-parler Format lokalizacji Użycie modułu django-localflavor do weryfikacji pól formularza Utworzenie silnika rekomendacji produktu Rekomendacja produktu na podstawie wcześniejszych transakcji Podsumowanie Rozdział 10. Budowa platformy e-learningu Utworzenie platformy e-learningu Utworzenie modeli kursu Rejestracja modeli w witrynie administracyjnej Użycie fikstur w celu dostarczenia początkowych danych dla modeli Utworzenie modeli dla zróżnicowanej treści Wykorzystanie dziedziczenia modelu Utworzenie modeli treści Utworzenie własnych kolumn modelu Dodawanie porządkowania do modułów i obiektów treści Utworzenie systemu zarządzania treścią Dodanie systemu uwierzytelniania Utworzenie szablonów uwierzytelniania Utworzenie widoków opartych na klasach Użycie domieszek w widokach opartych na klasach Praca z grupami i uprawnieniami Zarządzanie modułami kursu i treścią Użycie zbioru formularzy Dodanie treści do modułów kursów Zarządzanie modułami i treścią Zmiana kolejności modułów i treści Podsumowanie Rozdział 11. Renderowanie i buforowanie treści Wyświetlanie kursów Dodanie rejestracji uczestnika Utworzenie widoku rejestracji uczestnika Zapisanie się na kurs Spis treści 275 275 276 278 283 285 286 288 289 295 298 301 301 303 305 312 313 314 314 321 323 323 324 326 327 329 330 332 334 336 340 340 341 343 344 346 352 352 356 361 365 368 369 369 374 374 376 9 Poleć książkęKup książkę Spis treści Uzyskanie dostępu do treści kursu Generowanie różnych rodzajów treści Użycie frameworka buforowania Dostępne mechanizmy buforowania Instalacja Memcached Ustawienia bufora Dodanie Memcached do projektu Poziomy buforowania Użycie niskopoziomowego API buforowania Buforowanie fragmentów szablonu Buforowanie widoków Podsumowanie Rozdział 12. Utworzenie API Utworzenie API typu RESTful Instalacja Django Rest Framework Definiowanie serializacji Klasy parserów i renderowania formatów Utworzenie widoków listy i szczegółowego Serializacja zagnieżdżona Utworzenie własnych widoków Obsługa uwierzytelnienia Określenie uprawnień do widoków Utworzenie kolekcji widoku i routerów Dołączenie dodatkowych akcji do kolekcji widoku Tworzenie własnych uprawnień Serializacja treści kursu Podsumowanie Rozdział 13. Wdrożenie Wdrożenie w środowisku produkcyjnym Zarządzanie ustawieniami dla wielu środowisk Instalacja PostgreSQL Sprawdzenie projektu Udostępnianie Django za pomocą WSGI Instalacja uWSGI Konfiguracja uWSGI Instalacja Nginx Środowisko produkcyjne Konfiguracja Nginx Udostępnianie zasobów statycznych i multimedialnych Ochrona połączeń za pomocą SSL Utworzenie własnego oprogramowania pośredniczącego Utworzenie oprogramowania pośredniczącego do obsługi subdomeny Obsługa wielu subdomen za pomocą Nginx Implementacja własnych poleceń administracyjnych Podsumowanie Skorowidz 10 379 383 385 386 387 387 388 389 389 393 394 395 397 397 398 399 400 401 403 404 405 406 408 409 410 410 413 415 415 415 418 419 419 419 420 422 422 423 424 425 428 429 430 431 434 435 Poleć książkęKup książkę 4 Utworzenie witryny społecznościowej W poprzednim rozdziale dowiedziałeś się, jak opracować mapę witryny i kanał wiadomości dla postów bloga oraz zaimplementować silnik wyszukiwania w naszej aplikacji bloga. W tym rozdziale przechodzimy do opracowania aplikacji społecznościowej. Przygotujemy funkcjonal- ność pozwalającą użytkownikom na logowanie, wylogowanie oraz edytowanie i zerowanie hasła. Zobaczysz, jak można utworzyć niestandardowe profile dla użytkowników i jak zaimple- mentować uwierzytelnianie za pomocą innej witryny społecznościowej. Oto zagadnienia, na których skoncentruję się w tym rozdziale.  Użycie frameworka uwierzytelniania.  Utworzenie widoków pozwalających na rejestrację użytkowników.  Rozbudowa modelu User o obsługę niestandardowego profilu.  Implementacja uwierzytelnienia społecznościowego za pomocą modułu python-social-auth. Pracę rozpoczynamy od utworzenia nowego projektu. Utworzenie projektu witryny społecznościowej Przystępujemy teraz do budowy aplikacji społecznościowej umożliwiającej użytkownikom udo- stępnianie obrazów znalezionych w internecie. Na potrzeby tego projektu konieczne jest opra- cowanie pewnych komponentów. Oto one. Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych  System uwierzytelniania pozwalający użytkownikowi na rejestrowanie, logowanie, edycję profilu oraz zmianę i zerowanie hasła.  System obserwacji pozwalający użytkownikom na śledzenie swoich poczynań.  Funkcjonalność pozwalająca na wyświetlanie udostępnianych obrazów oraz implementacja bookmarkletu umożliwiającego użytkownikowi pobieranie obrazów z praktycznie każdej witryny internetowej.  Strumień aktywności dla każdego użytkownika pozwalający użytkownikom śledzić treść dodawaną przez obserwowanych użytkowników. W tym rozdziale zajmiemy się realizacją pierwszego z wymienionych punktów. Rozpoczęcie pracy nad aplikacją społecznościową Przejdź do powłoki i wydaj poniższe polecenia w celu utworzenia środowiska wirtualnego dla projektu, a następnie jego aktywacji. $ mkdir env $ virtualenv env $ source env/bin/activate Znak zachęty w powłoce wyświetla nazwę aktywnego środowiska wirtualnego, co pokaza- łem poniżej. (env)laptop:~ zenx$ W przygotowanym środowisku wirtualnym zainstaluj framework Django, wydając poniższe polecenie. $ pip install Django==2.0.5 Kolejnym krokiem jest utworzenie projektu, którego będziemy używać podczas prac nad aplika- cją społecznościową. Przejdź do powłoki i wydaj poniższe polecenie. $ django-admin startproject bookmarks W ten sposób utworzymy nowy projekt Django o nazwie bookmarks wraz z początkową strukturą plików i katalogów. Teraz przejdź do nowego katalogu projektu i utwórz nową aplikację o nazwie account, wydając poniższe polecenia. $ cd bookmarks/ $ django-admin startapp account Pamiętaj, aby aktywować nową aplikację w projekcie poprzez dodanie jej do elementów wymienionych na liście INSTALLED_APPS w pliku settings.py. Naszą aplikację umieść na początku listy, przed pozostałymi zainstalowanymi aplikacjami, tak jak pokazałem poniżej. INSTALLED_APPS = ( account.apps.AccountConfig , # … ) 98 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej Szablony uwierzytelniania Django zdefiniujemy nieco później. Umieszczając aplikację na pierwszym miejscu w ustawieniu INSTALLED_APPS, zapewniamy domyślne wykorzystywanie naszych szablonów uwierzytelniania, a nie szablonów uwierzytelniania zawartych w innych aplikacjach. Django szuka szablonów według kolejności występowania aplikacji w ustawieniu INSTALLED_APPS. Uruchom poniższe polecenie, aby przeprowadzić synchronizację bazy danych z modelami aplikacji domyślnych wskazanymi na liście INSTALLED_APPS. $ python manage.py migrate Zobaczysz, że zostaną zastosowane wszystkie początkowe migracje bazy danych Django. Teraz przystępujemy do budowy systemu uwierzytelniania w projekcie z wykorzystaniem frameworka uwierzytelniania Django. Użycie frameworka uwierzytelniania w Django Django jest dostarczany wraz z wbudowanym frameworkiem uwierzytelniania, który może ob- sługiwać uwierzytelnianie użytkowników, sesje, uprawnienia i grupy użytkowników. System uwierzytelniania oferuje widoki dla działań najczęściej podejmowanych przez użytkowników, takich jak logowanie, wylogowanie, zmiana hasła i zerowanie hasła. Wspomniany framework uwierzytelniania znajduje się w django.contrib.auth i jest używany także przez inne pakiety Django, typu contrib. Framework uwierzytelniania wykorzystaliśmy już w rozdziale 1. do utworzenia superużytkownika dla aplikacji bloga, aby mieć dostęp do witryny administracyjnej. Kiedy tworzysz nowy projekt Django za pomocą polecenia startproject, framework uwie- rzytelniania zostaje wymieniony w domyślnych ustawieniach projektu. Składa się z aplikacji django.contrib.auth oraz przedstawionych poniżej dwóch klas wymienionych w opcji MIDDLEWARE_ CLASSES projektu.  AuthenticationMiddleware. Wiąże użytkowników z żądaniami za pomocą mechanizmu sesji.  SessionMiddleware. Zapewnia obsługę bieżącej sesji między poszczególnymi żądaniami. Oprogramowanie pośredniczące to klasa wraz z metodami wykonywanymi globalnie w trakcie fazy przetwarzania żądania lub udzielania odpowiedzi na nie. W tej książce klasy oprogramowa- nia pośredniczącego będziemy wykorzystywać w wielu sytuacjach. Temat tworzenia oprogra- mowania pośredniczącego zostanie dokładnie omówiony w rozdziale 13. Framework uwierzytelniania zawiera również wymienione poniżej modele. 99 Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych  User. Model użytkownika wraz z podstawowymi kolumnami, takimi jak username, password, email, first_name, last_name i is_active.  Group. Model grupy do nadawania kategorii użytkownikom.  Permission. Uprawnienia pozwalające na wykonywanie określonych operacji. Opisywany framework zawiera także domyślne widoki uwierzytelniania i formularze, z których będziemy korzystać nieco później. Utworzenie widoku logowania Rozpoczynamy od użycia wbudowanego w Django frameworka uwierzytelniania w celu umożli- wienia użytkownikom zalogowania się w witrynie. Aby zalogować użytkownika, widok powinien wykonywać poniższe akcje. 1. Pobranie nazwy użytkownika i hasła z wysłanego formularza. 2. Uwierzytelnienie użytkownika na podstawie danych przechowywanych w bazie danych. 3. Sprawdzenie, czy konto użytkownika jest aktywne. 4. Zalogowanie użytkownika w witrynie i rozpoczęcie uwierzytelnionej sekcji. Najpierw musimy przygotować formularz logowania. Utwórz nowy plik forms.py w katalogu aplikacji account i umieść w nim poniższy fragment kodu. from django import forms class LoginForm(forms.Form): username = forms.CharField() password = forms.CharField(widget=forms.PasswordInput) Formularz będzie używany do uwierzytelnienia użytkownika na podstawie informacji przecho- wywanych w bazie danych. Zwróć uwagę na wykorzystanie widżetu PasswordInput do wygene- rowania elementu HTML input wraz z atrybutem type= password . Przeprowadź edycję pliku views.py aplikacji account i umieść w nim poniższy fragment kodu. from django.http import HttpResponse from django.shortcuts import render from django.contrib.auth import authenticate, login from .forms import LoginForm def user_login(request): if request.method == POST : form = LoginForm(request.POST) if form.is_valid(): cd = form.cleaned_data user = authenticate(username=cd[ username ], password=cd[ password ]) if user is not None: if user.is_active: login(request, user) return HttpResponse( Uwierzytelnienie zakończyło się sukcesem. ) 100 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej else: return HttpResponse( Konto jest zablokowane. ) else: return HttpResponse( Nieprawidłowe dane uwierzytelniające. ) else: form = LoginForm() return render(request, account/login.html , { form : form}) To jest kod podstawowego widoku logowania użytkownika. Po wywołaniu widoku user_login przez żądanie GET za pomocą wywołania form = LoginForm() tworzymy nowy egzemplarz formularza logowania i wyświetlamy go w szablonie. Kiedy użytkownik wyśle formularz przy użyciu żądania POST, przeprowadzane są następujące akcje. 1. Utworzenie egzemplarza formularza wraz z wysłanymi danymi. Do tego celu służy polecenie form = LoginForm(request.POST). 2. Sprawdzenie, czy formularz jest prawidłowy, za pomocą wywołania form.is_valid(). Jeżeli formularz jest nieprawidłowy, w szablonie wyświetlamy błędy wykryte podczas weryfikacji formularza (np. użytkownik nie wypełnił jednego z pól). 3. Jeżeli wysłane dane są prawidłowe, za pomocą metody authenticate() uwierzytelniamy użytkownika na podstawie informacji przechowywanych w bazie danych. Wymieniona metoda pobiera username i password, a zwraca obiekt User, gdy użytkownik zostanie uwierzytelniony, lub None w przeciwnym przypadku. Ponadto jeśli użytkownik nie będzie uwierzytelniony, zwracamy także obiekt HttpResponse wraz z odpowiednim komunikatem. 4. W przypadku pomyślnego uwierzytelnienia użytkownika za pomocą atrybutu is_active sprawdzamy, czy jego konto użytkownika jest aktywne. Wymieniony atrybut pochodzi z modelu User dostarczanego przez Django. Gdy konto użytkownika jest nieaktywne, zwracamy obiekt HttpResponse wraz z odpowiednim komunikatem. 5. Gdy konto użytkownika jest aktywne, logujemy go w witrynie internetowej. Rozpoczynamy także sesję dla użytkownika przez wywołanie metody login() i zwracamy odpowiedni komunikat informujący o powodzeniu operacji logowania. Zwróć uwagę na różnice między metodami authenticate() i login(). Metoda authenticate() sprawdza dane uwierzytelniające użytkownika i jeśli są prawidłowe, zwraca obiekt użytkownika. Natomiast metoda login() umieszcza użytkownika w bieżącej sesji. Teraz musimy opracować wzorzec adresu URL dla nowo zdefiniowanego widoku. Utwórz nowy plik urls.py w katalogu aplikacji account i umieść w nim poniższy fragment kodu. from django.urls import path from . import views urlpatterns = [ # Widoki logowania. path( login/ , views.user_login, name= login ) ] 101 Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych Przeprowadź edycję głównego pliku urls.py znajdującego się katalogu projektu bookmarks i dodaj wzorzec adresu URL aplikacji account, co przedstawiłem poniżej. from django.urls import include, path from django.contrib import admin urlpatterns = [ path( admin/ , admin.site.urls), path( account/ , include( account.urls )), ] Widok logowania jest teraz dostępny za pomocą adresu URL. Przechodzimy więc do przygoto- wania szablonu dla tego widoku. Ponieważ w projekcie nie mamy jeszcze żadnych szablonów, najpierw musimy utworzyć szablon bazowy, który następnie będzie mógł być rozszerzony przez szablon logowania. Wymienioną poniżej strukturę plików i katalogów utwórz w katalogu aplikacji account. templates/ account/ login.html base.html Przeprowadź edycję pliku base.html i umieść w nim poniższy fragment kodu. { load staticfiles } !DOCTYPE html html head title { block title }{ endblock } /title link href= { static css/base.css } rel= stylesheet /head body div id= header span class= logo Bookmarks /span /div div id= content { block content } { endblock } /div /body /html W ten sposób przygotowaliśmy szablon bazowy dla budowanej witryny internetowej. Podobnie jak w poprzednim projekcie, także w tym style CSS dołączamy w szablonie głównym. Niezbędne pliki statyczne znajdziesz w materiałach przygotowanych dla książki. Wystarczy skopiować podkatalog static z katalogu account we wspomnianych materiałach i umieścić go w tym samym położeniu budowanego projektu. Szablon bazowy definiuje bloki title i content, które mogą być wypełniane przez treść szablo- nów rozszerzających szablon bazowy. 102 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej Przechodzimy do utworzenia szablonu dla formularza logowania. W tym celu otwórz plik account/login.html i umieść w nim poniższy fragment kodu. { extends base.html } { block title }Logowanie{ endblock } { block content } h1 Logowanie /h1 p Wypełnij poniższy formularz, aby się zalogować: /p form action= . method= post {{ form.as_p }} { csrf_token } p input type= submit value= Zaloguj /p /form { endblock } Ten szablon zawiera formularz, którego egzemplarz jest tworzony w widoku. Ponieważ formularz zostanie wysłany za pomocą metody POST, dołączamy znacznik szablonu { csrf_token } w celu zapewnienia ochrony przed atakami typu CSRF. Więcej informacji na temat ataków CSRF przedstawiłem w rozdziale 2. W bazie danych nie ma jeszcze żadnych kont użytkowników. Konieczne jest utworzenie najpierw superużytkownika, aby zapewnić sobie dostęp do witryny administracyjnej i zarządzać pozosta- łymi użytkownikami. Przejdź do powłoki i wydaj polecenie python manage.py createsuperuser. Podaj wybraną nazwę użytkownika, adres e-mail i hasło. Następnie uruchom serwer programi- styczny przez wydanie polecenia python manage.py runserver i w przeglądarce internetowej przejdź pod adres http://127.0.0.1:8000/admin/. Dostęp do witryny administracyjnej uzyskasz po podaniu ustalonej przed chwilą nazwy użytkownika i hasła. Gdy znajdziesz się już w witrynie administracyjnej Django, zobaczysz modele User (łącze Użytkownicy) i Group (łącze Grupy) dla wbudowanego w Django frameworka uwierzytelniania. Utwórz nowego użytkownika, używając do tego witryny administracyjnej, a następnie w prze- glądarce internetowej przejdź pod adres http://127.0.0.1:8000/account/login/. Powinieneś zo- baczyć wygenerowany szablon wraz z formularzem logowania (zobacz pierwszy rysunek na następnej stronie). Spróbuj teraz wysłać formularz, pozostawiając niewypełnione jedno z pól. W takim przypadku formularz jest uznawany za nieprawidłowy i zostanie wyświetlony komunikat błędu, co pokazałem na drugim rysunku na następnej stronie. 103 Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych Warto wiedzieć, że niektóre nowoczesne przeglądarki uniemożliwiają przesyłanie formularzy z pustymi lub błędnymi polami. Dzieje się tak dlatego, że przeglądarka sprawdza popraw- ność formularza na podstawie typów pól i ograniczeń na poziomie pól. W takim przypadku formularz nie zostanie przesłany, a przeglądarka wyświetli komunikat o błędzie dla pól, które są wypełnione nieprawidłowo. Jeżeli podasz dane nieistniejącego użytkownika lub błędne hasło, Django wygeneruje komunikat o nieudanym logowaniu. Natomiast po podaniu prawidłowych danych uwierzytelniających Django wyświetli komunikat o zakończonym sukcesem logowaniu, co pokazałem poniżej. 104 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej Użycie widoków uwierzytelniania w Django Framework uwierzytelniania w Django zawiera wiele formularzy i widoków gotowych do na- tychmiastowego użycia. Utworzony przed chwilą widok logowania to dobre ćwiczenie pomaga- jące w zrozumieniu procesu uwierzytelniania użytkowników w Django. Jednak w większości przypadków możesz wykorzystać wspomniane domyślne widoki uwierzytelniania. Do obsługi uwierzytelniania Django oferuje wymienione poniżej widoki.  LoginView. Obsługa formularza logowania oraz proces zalogowania użytkownika.  LogoutView. Obsługa wylogowania użytkownika. Do obsługi zmiany hasła Django oferuje wymienione poniżej widoki.  PasswordChangeView. Obsługa formularza pozwalającego użytkownikowi na zmianę hasła.  PasswordChangeDoneView. Strona informująca o sukcesie operacji; zostanie wyświetlona użytkownikowi, gdy zmiana hasła zakończy się powodzeniem. Natomiast do obsługi operacji zerowania hasła Django oferuje następujące widoki.  PasswordResetView. Umożliwienie użytkownikowi wyzerowania hasła. Generowane jest przeznaczone tylko do jednokrotnego użycia łącze wraz z tokenem, które następnie będzie wysłane na adres e-mail danego użytkownika.  PasswordResetDone. Wyświetlenie użytkownikowi strony z informacją o wysłaniu wiadomości e-mail wraz z łączem pozwalającym na wyzerowanie hasła.  PasswordResetConfirmView. Widok umożliwiający użytkownikowi zdefiniowanie nowego hasła.  PasswordResetCompleteView. Strona informująca o sukcesie operacji; zostanie wyświetlona użytkownikowi, gdy wyzerowanie hasła zakończy się powodzeniem. Zastosowanie wymienionych wyżej widoków może zaoszczędzić sporą ilość czasu podczas tworzenia witryny internetowej obsługującej konta użytkowników. W widokach tych używane są wartości domyślne, które oczywiście można nadpisać. Przykładem może być wskazanie poło- żenia szablonu przeznaczonego do wygenerowania lub formularza wyświetlanego przez widok. Więcej informacji na temat wbudowanych widoków uwierzytelniania znajdziesz na stronie https://docs.djangoproject.com/en/2.0/topics/auth/default/#module-django.contrib.auth.views. Widoki logowania i wylogowania Przeprowadź edycję pliku urls.py aplikacji account i dodaj kolejne wzorce adresów URL. Po wprowadzeniu zmian zawartość wymienionego pliku powinna przedstawiać się następująco. from django.urls import path from django.contrib.auth import views as auth_views from . import views 105 Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych urlpatterns = [ # poprzedni widok login view # path( login/ , views.user_login, name= login ), path( login/ , auth_views.LoginView.as_view(), name= login ), path( logout/ , auth_views.LogoutView.as_view(), name= logout ), ] Umieściliśmy znak komentarza na początku wiersza wzorca adresu URL dla utworzonego wcześniej widoku LoginView. Teraz wykorzystamy widok login oferowany przez wbudowany w Django framework uwierzytelniania. Dodaliśmy także wzorzec adresu URL dla widoku LogoutView. Utwórz nowy podkatalog w katalogu szablonów aplikacji account i nadaj mu nazwę registration. Podkatalog ten to domyślna lokalizacja, w której widoki uwierzytelniania Django spodziewają się znaleźć szablony. Moduł django.contrib.admin zawiera kilka szablonów uwierzytelniania, które są używane w witrynie administracyjnej. Aplikację account umieściliśmy na początku ustawienia INSTALLED_ APPS, aby Django domyślnie korzystał z naszych szablonów zamiast szablonów uwierzytel- niania zdefiniowanych w innych aplikacjach. W katalogu templates/registration utwórz plik login.html i umieść w nim poniższy fragment kodu. { extends base.html } { block title }Logowanie{ endblock } { block content } h1 Logowanie /h1 { if form.errors } p Nazwa użytkownika lub hasło są nieprawidłowe. Spróbuj ponownie. /p { else } p Wypełnij poniższy formularz, aby się zalogować: /p { endif } div class= login-form form action= { url login } method= post {{ form.as_p }} { csrf_token } input type= hidden name= next value= {{ next }} / p input type= submit value= Zaloguj /p /form /div { endblock } Ten szablon logowania jest bardzo podobny do utworzonego wcześniej. Domyślnie Django używa formularza AuthenticationForm pochodzącego z django.contrib.auth.forms. Formularz próbuje uwierzytelnić użytkownika i zgłasza błąd weryfikacji, gdy logowanie zakończy się nie- 106 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej powodzeniem. W takim przypadku za pomocą znacznika szablonu { if form.errors } można przeanalizować te błędy, aby sprawdzić, czy podane zostały nieprawidłowe dane uwie- rzytelniające. Zwróć uwagę na dodanie ukrytego elementu HTML input przeznaczonego do wysłania wartości zmiennej o nazwie next. Zmienna jest ustawiania przez widok logowania, gdy w żądaniu będzie przekazany parametr next (np. http://127.0.0.1:8000/account/login/ ?next=/account/). Wartością parametru next musi być adres URL. Jeżeli ten parametr zostanie podany, widok logowania w Django przekieruje użytkownika po zalogowaniu do podanego adresu URL. Teraz utwórz szablon logged_out.html w katalogu registration i umieść w nim następujący fragment kodu. { extends base.html } { block title }Wylogowanie{ endblock } { block content } h1 Wylogowanie /h1 p Zostałeś pomyślnie wylogowany. Możesz a href= { url login } zalogować się ponownie /a . /p { endblock } Ten szablon zostanie przez Django wyświetlony po wylogowaniu użytkownika. Po dodaniu wzorców adresu URL oraz szablonów dla widoków logowania i wylogowania budo- wana tutaj witryna internetowa jest gotowa na obsługę logowania użytkowników za pomocą ofe- rowanych przez Django widoków uwierzytelniania. Przystępujemy teraz do utworzenia nowego widoku przeznaczonego do wyświetlenia użytkow- nikowi panelu głównego (ang. dashboard) po tym, jak już zaloguje się w aplikacji. Otwórz plik views.py aplikacji account i umieść w nim poniższy fragment kodu. from django.contrib.auth.decorators import login_required @login_required def dashboard(request): return render(request, account/dashboard.html , { section : dashboard }) Widok został oznaczony dekoratorem login_required frameworka uwierzytelniania. Zadanie dekoratora login_required polega na sprawdzeniu, czy bieżący użytkownik został uwierzytel- niony. Jeżeli użytkownik jest uwierzytelniony, następuje wykonanie udekorowanego widoku. Gdy natomiast użytkownik nie jest uwierzytelniony, zostaje przekierowany na stronę logowania, a adres URL, do którego próbował uzyskać dostęp, będzie podany jako wartość parametru next żądania GET. Tym samym po udanym logowaniu użytkownik powróci na stronę, do której wcześniej próbował uzyskać dostęp. Pamiętaj, że do obsługi tego rodzaju sytuacji dodaliśmy w szablonie logowania ukryty element input . 107 Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych Zdefiniowaliśmy również zmienną section. Wykorzystamy ją do ustalenia, którą sekcję witryny obserwuje użytkownik. Wiele widoków może odpowiadać tej samej sekcji. To jest prosty sposób na zdefiniowanie, której sekcji odpowiadają poszczególne widoki. Teraz należy utworzyć szablon dla widoku panelu głównego. Utwórz nowy plik w katalogu templates/account/, nadaj mu nazwę dashboard.html i umieść w nim przedstawiony poniżej kod. { extends base.html } { block title }Panel główny{ endblock } { block content } h1 Panel główny /h1 p Witaj w panelu głównym. /p { endblock } Kolejnym krokiem jest dodanie poniższego wzorca adresu URL dla nowego widoku. To zadanie przeprowadzamy w pliku urls.py aplikacji account. urlpatterns = [ # … path( , views.dashboard, name= dashboard ), ] Teraz przeprowadź edycję pliku settings.py projektu bookmarks i dodaj poniższy fragment kodu. LOGIN_REDIRECT_URL = dashboard LOGIN_URL = login LOGOUT_URL = logout Oto wyjaśnienie działania poszczególnych opcji.  LOGIN_REDIRECT_URL. Wskazujemy Django adres URL, do którego ma nastąpić przekierowanie, gdy widok contrib.auth.views.login nie otrzymuje parametru next.  LOGIN_URL. Adres URL, do którego ma nastąpić przekierowanie po zalogowaniu użytkownika (np. za pomocą dekoratora login_required).  LOGOUT_URL. Adres URL, do którego ma nastąpić przekierowanie po wylogowaniu użytkownika. Używamy nazw wzorców adresów URL, które wcześniej zdefiniowaliśmy przy użyciu atrybutu name funkcji path(). Do tych ustawień zamiast nazw adresów URL można również użyć zakodo- wanych „na sztywno” adresów URL. Oto krótkie podsumowanie przeprowadzonych dotąd działań.  Do projektu dodaliśmy wbudowane we frameworku uwierzytelniania Django widoki logowania i wylogowania.  Przygotowaliśmy własne szablony dla obu widoków i zdefiniowaliśmy prosty widok, do którego użytkownik zostanie przekierowany po zalogowaniu. 108 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej  Na koniec skonfigurowaliśmy ustawienia Django, aby wspomniane adresy URL były używane domyślnie. Teraz do szablonu bazowego dodamy łącza logowania i wylogowania, co pozwoli na zebranie wszystkiego w całość. Aby to zrobić, koniecznie trzeba ustalić, czy bieżący użytkownik jest zalo- gowany. Na tej podstawie zostanie wyświetlone prawidłowe łącze (logowania lub wylogowania). Bieżący użytkownik jest przez oprogramowanie pośredniczące ustawiony w obiekcie HttpRequest. Dostęp do niego uzyskujesz za pomocą request.user. Użytkownika znajdziesz w wymienionym obiekcie nawet wtedy, gdy nie został uwierzytelniony. W takim przypadku użytkownik będzie zdefiniowany w postaci egzemplarza obiektu AnonymousUser. Najlepszym sposobem zweryfiko- wania, czy użytkownik został uwierzytelniony, jest sprawdzenie wartości jego atrybutu „tylko do odczytu” is_authenticated. Przeprowadź edycję pliku base.html i zmodyfikuj element div o identyfikatorze header, tak jak przedstawiłem poniżej. div id= header span class= logo Bookmarks /span { if request.user.is_authenticated } ul class= menu li { if section == dashboard }class= selected { endif } a href= { url dashboard } Panel główny /a /li li { if section == images }class= selected { endif } a href= # Obrazy /a /li li { if section == people }class= selected { endif } a href= # Osoby /a /li /ul { endif } span class= user { if request.user.is_authenticated } Witaj, {{ request.user.first_name }}! a href= { url logout } Wyloguj /a { else } a href= { url login } Zaloguj /a { endif } /span /div Jak możesz zobaczyć, menu witryny internetowej będzie wyświetlane jedynie uwierzytelnio- nym użytkownikom. Sprawdzana jest także bieżąca sekcja witryny, aby dodać klasę atrybutu selected do odpowiedniego elementu li i tym samym za pomocą CSS podświetlić nazwę aktualnej sekcji. Wyświetlane jest również imię uwierzytelnionego użytkownika i łącze pozwala- jące mu na wylogowanie. Jeżeli użytkownik nie jest uwierzytelniony, wyświetlone będzie jedynie łącze pozwalające mu na zalogowanie. 109 Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych Teraz w przeglądarce internetowej przejdź pod adres http://127.0.0.1:8000/account/login/. Powinieneś zobaczyć stronę logowania. Podaj prawidłowe dane uwierzytelniające i kliknij przy- cisk Zaloguj. Po udanym logowaniu znajdziesz się na stronie pokazanej poniżej. Jak można zobaczyć, nazwa sekcji Panel główny została za pomocą stylów CSS wyświetlona innym kolorem czcionki, ponieważ odpowiadającemu jej elementowi li przypisaliśmy klasę selected. Skoro użytkownik jest uwierzytelniony, jego imię wyświetlamy po prawej stronie nagłówka. Kliknij łącze Wyloguj, powinieneś zobaczyć stronę pokazaną na poniższym rysunku. Na tej stronie został wyświetlony komunikat informujący o udanym wylogowaniu i dlatego nie jest dłużej wyświetlane menu witryny internetowej. Łącze znajdujące się po prawej stronie nagłówka zmienia się na Zaloguj. Jeżeli zamiast przygotowanej wcześniej strony wylogowania zostanie wyświetlona strona wylogowania witryny administracyjnej Django, sprawdź listę INSTALLED_APPS projektu i upewnij się, że wpis dotyczący aplikacji django.contrib.admin znajduje się po account. Oba wymienione szablony są umiesz- czone na tej samej względnej ścieżce dostępu i mechanizm wczytywania szablonów w Django po prostu użyje pierwszego znalezionego. Widoki zmiany hasła Użytkownikom witryny musimy zapewnić możliwość zmiany hasła po zalogowaniu się. Zinte- grujemy więc oferowane przez framework uwierzytelniania Django widoki przeznaczone do obsługi procedury zmiany hasła. Otwórz plik urls.py aplikacji account i umieść w nim poniższe wzorce adresów URL. # Adresy URL przeznaczone do obsługi zmiany hasła. path( password_change/ , 110 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej auth_views.PasswordChangeView.as_view(), name= password_change ), path( password_change/done/ , auth_views.PasswordChangeDoneView.as_view(), name= password_change_done ), Widok PasswordChangeView zapewnia obsługę formularza pozwalającego na zmianę hasła, nato- miast PasswordChangeDoneView wyświetla komunikat informujący o sukcesie po udanej operacji zmiany hasła przez użytkownika. Przystępujemy więc do przygotowania szablonu dla wymienio- nych widoków. Dodaj nowy plik w katalogu templates/registration aplikacji account i nadaj mu nazwę password_change_form.html. Następnie w nowym pliku umieść poniższy fragment kodu. { extends base.html } { block title }Zmiana hasła{ endblock } { block content } h1 Zmiana hasła /h1 p Wypełnij poniższy formularz, aby zmienić hasło. /p form action= . method= post {{ form.as_p }} p input type= submit value= Zmień /p { csrf_token } /form { endblock } Przedstawiony szablon zawiera formularz przeznaczony do obsługi procedury zmiany hasła. Teraz w tym samym katalogu utwórz kolejny plik i nadaj mu nazwę password_change_done.html. Następnie w nowym pliku umieść poniższy fragment kodu. { extends base.html } { block title }Hasło zostało zmienione{ endblock } { block content } h1 Hasło zostało zmienione /h1 p Zmiana hasła zakończyła się powodzeniem. /p { endblock } Ten szablon zawiera jedynie komunikat sukcesu wyświetlany, gdy przeprowadzona przez użytkownika operacja zmiany hasła zakończy się powodzeniem. W przeglądarce internetowej przejdź pod adres http://127.0.0.1:8000/account/password_change/. Jeżeli użytkownik nie jest zalogowany, nastąpi przekierowanie na stronę logowania. Po udanym uwierzytelnieniu zobaczysz formularz pozwalający na zmianę hasła pokazany na rysunku na następnej stronie. 111 Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych W wyświetlonym formularzu należy podać dotychczasowe hasło oraz nowe, a następnie kliknąć przycisk Zmień. Jeżeli operacja przebiegnie bez problemów, zostanie wyświetlona pokazana poniżej strona wraz z komunikatem informującym o sukcesie. Wyloguj się i zaloguj ponownie za pomocą nowego hasła, aby sprawdzić, że wszystko działa zgodnie z oczekiwaniami. Widoki zerowania hasła W pliku urls.py aplikacji account dodaj poniższe wzorce adresów URL dla widoków przeznaczo- nych do obsługi procedury zerowania hasła. # Adresy URL przeznaczone do obsługi procedury zerowania hasła. path( password_reset/ , auth_views.PasswordResetView.as_view(), name= password_reset ), path( password_reset/done/ , auth_views.PasswordResetDoneView.as_view(), name= password_reset_done ), 112 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej path( reset/ uidb64 / token / , auth_views.PasswordResetConfirmView.as_view(), name= password_reset_confirm ), path( reset/done/ , auth_views.PasswordResetCompleteView.as_view(), name= password_reset_complete ), Dodaj nowy plik w katalogu templates/registration/ aplikacji account i nadaj mu nazwę password_reset_form.html. Następnie w utworzonym pliku umieść poniższy fragment kodu. { extends base.html } { block title }Zerowanie hasła{ endblock } { block content } h1 Zapomniałeś hasła? /h1 p Podaj adres e-mail, aby zdefiniować nowe hasło. /p form action= . method= post {{ form.as_p }} p input type= submit value= Wyślij e-mail /p { csrf_token } /form { endblock } Teraz utwórz w tym samym katalogu kolejny plik, tym razem o nazwie password_reset_ email.html. Następnie umieść w nim poniższy fragment kodu. Otrzymaliśmy żądanie wyzerowania hasła dla użytkownika używającego adresu e-mail {{ email }}. Kliknij poniższe łącze: {{ protocol }}://{{ domain }}{ url password_reset_confirm uidb64=uid token=token } Twoja nazwa użytkownika: {{ user.get_username }} Szablon ten zostanie użyty do wygenerowania wiadomości e-mail wysyłanej użytkownikowi, który chce przeprowadzić operację wyzerowania hasła. Utwórz w tym samym katalogu kolejny plik i nadaj mu nazwę password_reset_done.html. Następnie umieść w nim poniższy fragment kodu. { extends base.html } { block title }Zerowanie hasła{ endblock } { block content } h1 Zerowanie hasła /h1 p Wysłaliśmy Ci wiadomość e-mail wraz z instrukcjami pozwalającymi na zdefiniowanie nowego hasła. /p p Jeżeli nie otrzymałeś tej wiadomości, to upewnij się, że w formularzu zerowania hasła wpisałeś adres e-mail podany podczas zakładania konta użytkownika. /p { endblock } Utwórz kolejny plik szablonu, nadaj mu nazwę password_reset_confirm.html, a następnie umieść w nim poniższy fragment kodu. 113 Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych { extends base.html } { block title }Zerowanie hasła{ endblock } { block content } h1 Zerowanie hasła /h1 { if validlink } p Dwukrotnie podaj nowe hasło: /p form action= . method= post {{ form.as_p }} { csrf_token } p input type= submit value= Zmień hasło / /p /form { else } p Łącze pozwalające na wyzerowanie hasła jest nieprawidłowe, ponieważ prawdopodobnie zostało już wcześniej użyte. Musisz ponownie rozpocząć procedurę zerowania hasła. /p { endif } { endblock } W kodzie sprawdzamy, czy podane łącze jest prawidłowe. Oferowany przez Django widok PasswordResertConfirmView ustawia zmienną i umieszcza ją w kontekście szablonu. Jeżeli łącze jest prawidłowe, wtedy wyświetlamy użytkownikowi formularz wyzerowania hasła. Utwórz kolejny plik szablonu i nadaj mu nazwę password_reset_complete.html. Następnie umieść w nim poniższy fragment kodu. { extends base.html } { block title }Zerowanie hasła{ endblock } { block content } h1 Zerowanie hasła /h1 p Hasło zostało zdefiniowane. Możesz się już a href= { url login } zalogować /a . /p { endblock } Na koniec przeprowadź edycję szablonu registration/login.html aplikacji account i dodaj poniższy fragment kodu po elemencie form . p a href= { url password_reset } Zapomniałeś hasła? /a /p Teraz w przeglądarce internetowej przejdź pod adres http://127.0.0.1:8000/account/login/ i kliknij łącze Zapomniałeś hasła?. Powinieneś zobaczyć stronę podobną do pokazanej na rysunku na następnej stronie. Na tym etapie w pliku settings.py projektu trzeba umieścić konfigurację serwera SMTP, aby umożliwić Django wysyłanie wiadomości e-mail. Procedura dodania tego rodzaju konfiguracji do projektu została omówiona w rozdziale 2. Jednak podczas pracy nad aplikacją można skon- figurować Django do przekazywania wiadomości e-mail na standardowe wyjście zamiast ich 114 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej faktycznego wysyłania za pomocą serwera SMTP. Framework Django oferuje mechanizm wyświetlania wiadomości e-mail w powłoce. Przeprowadź edycję pliku settings.py projektu i dodaj w nim poniższy wiersz kodu. EMAIL_BACKEND = django.core.mail.backends.console.EmailBackend Opcja EMAIL_BACKEND wskazuje na użycie klasy przeznaczonej do wysyłania wiadomości e-mail. Wróć do przeglądarki internetowej, podaj adres e-mail istniejącego użytkownika i kliknij przy- cisk Wyślij e-mail. Powinieneś zobaczyć stronę pokazaną poniżej. Spójrz na konsolę, na której został uruchomiony serwer programistyczny. Powinieneś zobaczyć wygenerowaną wiadomość e-mail. Content-Type: text/plain; charset= utf-8 MIME-VERSION: 1.0 Content-Transfer-Encoding: 7bit Subject: Password reset on 127.0.0.1:8000 From: webmaster@localhost To: user@domain.com Date: Fri, 15 Dec 2017 14:35:08 -0000 Message-ID: 20171215143508.62996.55653@zenx.local Otrzymaliśmy żądanie wyzerowania hasła dla użytkownika używającego adresu e-mail nazwa_użytkownika@nazwa_domeny.pl. Kliknij poniższe łącze: 115 Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych http://127.0.0.1:8000/account/password-reset/confirm/MQ/45f9c3f30caafd523055fcc/ Twoja nazwa użytkownika: zenx Ta wiadomość e-mail jest generowana za pomocą utworzonego wcześniej szablonu password_ reset_email.html. Adres URL pozwalający na przejście do strony zerowania hasła zawiera token dynamicznie wygenerowany przez Django. Po otworzeniu w przeglądarce internetowej otrzymanego łącza przejdziesz na stronę pokazaną poniżej. To jest strona umożliwiająca użytkownikowi podanie nowego hasła; odpowiada ona szablonowi password_reset_confirm.html. W obu polach formularza wpisz nowe hasło, a następnie kliknij przycisk Zmień hasło. Django utworzy nowe zaszyfrowane hasło i zapisze je w bazie danych. Następnie zostanie wyświetlona pokazana poniżej strona wraz z komunikatem informują- cym o sukcesie operacji. Teraz użytkownik może zalogować się na swoje konto, podając nowe hasło. Każdy token przeznaczony do ustawienia nowego hasła może być użyty tylko jednokrotnie. Jeżeli ponownie otworzysz w przeglądarce internetowej otrzymane łącze, zostanie wyświetlony komunikat informujący o nieprawidłowym tokenie. 116 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej W ten sposób w projekcie zintegrowałeś widoki oferowane przez framework uwierzytelniania w Django. Wspomniane widoki są odpowiednie do użycia w większości sytuacji. Jednak zawsze możesz utworzyć własne widoki, jeśli potrzebna jest obsługa niestandardowego zachowania. Wzorce adresów URL uwierzytelniania, które właśnie utworzyliśmy, udostępnia również frame- work Django. Możesz ująć w komentarz wzorce adresów URL uwierzytelniania, które dodali- śmy do pliku urls.py aplikacji account, i zamiast tego dodać aplikację django.contrib.auth.urls tak, jak pokazałem poniżej. from django.urls import path, include # … urlpatterns = [ # … path( , include( django.contrib.auth.urls )), ] Więcej informacji na temat wzorców adresów URL uwierzytelniania można znaleźć na stronie https://github.com/django/django/blob/stable/2.0.x/django/contrib/auth/urls.py. Rejestracja użytkownika i profile użytkownika Istniejący użytkownicy mogą się zalogować, wylogować, zmienić hasło lub je wyzerować, jeśli zapomnieli, jakie było. Musimy teraz przygotować widok pozwalający nowym odwiedzającym witrynę na założenie w niej konta użytkownika. Rejestracja użytkownika Przystępujemy do utworzenia prostego widoku pozwalającego odwiedzającemu na zareje- strowanie się w naszej witrynie internetowej. Zaczniemy od formularza, w którym nowy użytkownik wprowadzi nazwę użytkownika, swoje imię i nazwisko oraz hasło. Przeprowadź edycję pliku forms.py w katalogu aplikacji account i umieść w nim poniższy fragment kodu. from django.contrib.auth.models import User class UserRegistrationForm(forms.ModelForm): password = forms.CharField(label= Hasło , widget=forms.PasswordInput) password2 = forms.CharField(label= Powtórz hasło , widget=forms.PasswordInput) class Meta: model = User fields = ( username , first_name , email ) 117 Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych def clean_password2(self): cd = self.cleaned_data if cd[ password ] != cd[ password2 ]: raise forms.ValidationError( Hasła nie są identyczne. ) return cd[ password2 ] Utworzyliśmy formularz modelu (klasa ModelForm) dla modelu User. W przygotowanym formula- rzu będą uwzględnione jedynie pola username, first_name i email. Wartości wymienionych pól będą weryfikowane na podstawie odpowiadających im kolumn modelu. Jeśli np. użytkownik wybierze już istniejącą nazwę użytkownika, otrzyma błąd w trakcie weryfikacji formularza. Dodaliśmy dwa dodatkowe pola password i password2 przeznaczone do zdefiniowania hasła i jego potwierdzenia. Ponadto zdefiniowaliśmy metodę clean_password2() odpowiedzialną za porów- nanie obu wpisanych haseł. Jeżeli nie są takie same, formularz będzie uznany za nieprawi- dłowy. Ta operacja sprawdzenia nowego hasła jest przeprowadzana podczas weryfikacji formularza za pomocą jego metody is_valid(). Istnieje możliwość dostarczenia metody clean_ nazwa_pola () dla dowolnego pola formularza w celu wyczyszczenia jego wartości lub zgłoszenia błędu weryfikacji formularza dla określonego pola. Formularze zawierają także ogólną metodę clean() przeznaczoną do sprawdzenia całego formularza, co okazuje się uży- teczne podczas weryfikacji pól zależnych wzajemnie od siebie. Django oferuje również formularz UserCreationForm gotowy do natychmiastowego użycia. Znajdziesz go w django.contrib.auth.forms, a sam formularz jest bardzo podobny do utwo- rzonego przez nas wcześniej. Przeprowadź edycję pliku views.py aplikacji account i umieść w nim poniższy fragment kodu. from .forms import LoginForm, UserRegistrationForm def register(request): if request.method == POST : user_form = UserRegistrationForm(request.POST) if user_form.is_valid(): # Utworzenie nowego obiektu użytkownika, ale jeszcze nie zapisujemy go w bazie danych. new_user = user_form.save(commit=False) # Ustawienie wybranego hasła. new_user.set_password( user_form.cleaned_data[ password ]) # Zapisanie obiektu User. new_user.save() return render(request, account/register_done.html , { new_user : new_user}) else: user_form = UserRegistrationForm() return render(request, account/register.html , { user_form : user_form}) Widok pozwalający na utworzenie nowego konta użytkownika jest całkiem prosty. Zamiast zapisywać wprowadzone przez użytkownika hasło w postaci zwykłego tekstu, wykorzystujemy metodę set_password() modelu User, która ze względów bezpieczeństwa szyfruje hasło. 118 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej Teraz przeprowadź edycję pliku urls.py aplikacji account i dodaj w nim poniższy wzorzec adresu URL. path( register/ , views.register, name= register ), Na koniec utwórz nowy szablon w katalogu szablonów aplikacji account, nadaj mu nazwę register.html, a następnie umieść w nim poniższy kod. { extends base.html } { block title }Utwórz konto{ endblock } { block content } h1 Utwórz konto /h1 p Wypełnij poniższy formularz, aby się zarejestrować: /p form action= . method= post {{ user_form.as_p }} { csrf_token } p input type= submit value= Utwórz konto /p /form { endblock } Do tego samego katalogu dodaj nowy plik szablonu o nazwie register_done.html. Następnie umieść w nim poniższy fragment kodu. { extends base.html } { block title }Witaj{ endblock } { block content } h1 Witaj, {{ new_user.first_name }}! /h1 p Twoje konto zostało utworzone. Możesz się już a href= { url login } zalogować /a . /p { endblock } Teraz w przeglądarce internetowej przejdź pod adres http://127.0.0.1:8000/account/register/. Powinieneś zobaczyć wyświetloną stronę rejestracji nowego użytkownika (zobacz pierwszy rysunek na następnej stronie). Podaj informacje potrzebne do utworzenia nowego konta użytkownika i kliknij przycisk Utwórz konto. Jeżeli wszystkie pola zostały wypełnione prawidłowo, zostanie wyświetlona strona wraz z komunikatem informującym o pomyślnym utworzeniu nowego konta użytkownika (zobacz drugi rysunek na następnej stronie). Kliknij łącze Zaloguj, a następnie podaj dane uwierzytelniające utworzonego przed chwilą użyt- kownika, aby potwierdzić, że możesz uzyskać dostęp do nowego konta. 119 Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych Teraz do szablonu logowania musimy dodać łącze pozwalające na rejestrację użytkownika. Przeprowadź edycję szablonu registration/login.html i poniższy wiersz kodu p Wypełnij poniższy formularz, aby się zalogować: /p zastąp następującym p Wypełnij poniższy formularz, aby się zalogować. Jeżeli nie masz jeszcze konta, możesz je utworzyć a href= { url register } tutaj /a . /p W ten sposób do strony rejestracji nowego konta użytkownika można przejść bezpośrednio z- e strony logowania. Rozbudowa modelu User Podczas pracy z kontami użytkowników przekonasz się, że model User oferowany przez frame- work uwierzytelniania Django sprawdza się w większości przypadków. Jednak model User jest dostarczany wraz z jedynie najbardziej podstawowymi kolumnami. Dlatego też prawdo- 120 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej podobnie będzie trzeba niekiedy rozbudować model o możliwość przechowywania dodatkowych danych. Najlepszym sposobem będzie przygotowanie modelu profilu zawierającego wszystkie dodatkowe kolumny oraz związek typu „jeden do jednego” z dostarczanym przez Django modelem User. Przeprowadź edycję pliku models.py aplikacji account i umieść w nim poniższy fragment kodu. from django.db import models from django.conf import settings class Profile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) date_of_birth = models.DateField(blank=True, null=True) photo = models.ImageField(upload_to= users/ Y/ m/ d , blank=True) def __str__(self): return Profil użytkownika {}. .format(self.user.username) Aby kod był generyczny, do pobrania modelu użytkownika używamy funkcji get_user_model(). Następnie, podczas definiowania relacji z tym modelem zamiast bezpośredniego odwoływania się do modelu User można korzystać z opcji AUTH_USER_MODEL. Kolumna user definiuje relację typu „jeden do jednego” i pozwala na powiązanie profilu z użytkownikiem. Użyliśmy klauzuli CASCADE dla parametru on_delete, aby po usunięciu użyt- kownika został również usunięty powiązany z nim profil. Zdjęcie użytkownika jest przecho- wywane w kolumnie ImageField. W celu zarządzania obrazami konieczne będzie zainstalowanie jednego z podanych pakietów Pythona — PIL (ang. python imaging library) lub Pillow, który powstał na bazie PIL. Instalacja pakietu Pillow zostanie przeprowadzona po wydaniu w po- włoce poniższego polecenia. $ pip install Pillow==5.1.0 Aby na serwerze programistycznym Django umożliwić obsługę plików multimedialnych przeka- zywanych przez użytkowników, w pliku settings.py projektu należy dodać poniższe wiersze kodu. MEDIA_URL = /media/ MEDIA_ROOT = os.path.join(BASE_DIR, media/ ) Opcja MEDIA_URL wskazuje bazowy adres URL określający lokalizację przeznaczoną do przecho- wywania plików multimedialnych przekazywanych przez użytkowników. Natomiast opcja MEDIA_ROOT określa lokalną ścieżkę dostępu dla tych plików. Ścieżka dostępu jest budowana dynamicznie względem projektu, co zapewnia możliwość ogólnego działania kodu. Teraz przeprowadź edycję pliku głównego urls.py projektu bookmarks i w następujący sposób zmodyfikuj znajdujący się w nim kod. from django.conf.urls import path, include from django.contrib import admin 121 Poleć książkęKup książkę Django 2. Praktyczne tworzenie aplikacji sieciowych from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path( admin/ , admin.site.urls), path( account/ , include( account.urls )), ] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) W ten sposób serwer programistyczny Django stał się odpowiedzialny za obsługę plików multimedialnych podczas prac nad aplikacją. Funkcja pomocnicza static() jest odpowiednia do stosowania w środowisku programistycznym, ale na pewno nie w produkcyjnym. Pamiętaj, aby w środowisku produkcyjnym nigdy nie udostępniać plików statycznych za pomocą Django. Przejdź do powłoki i wydaj następujące polecenie, które spowoduje utworzenie migracji bazy - danych dla nowego modelu. $ python manage.py makemigrations Powinieneś otrzymać następujące dane wyjściowe. Migrations for account : 0001_initial.py: - Create model Profile Kolejnym krokiem jest zsynchronizowanie bazy danych za pomocą poniższego polecenia. $ python manage.py migrate Wygenerowany wynik będzie zawierał m.in. następujący wiersz. Applying account.0001_initial... OK Przeprowadź edycję pliku admin.py aplikacji account i zarejestruj model Profile w witrynie administracyjnej, co pokazałem poniżej. from django.contrib import admin from .models import Profile @admin.register(Profile) class ProfileAdmin(admin.ModelAdmin): list_display = [ user , date_of_birth , photo ] Ponownie uruchom serwer programistyczny za pomocą polecenia python manage.py runserver. Teraz będziesz mógł zobaczyć model Profile w witrynie administracyjnej projektu, co pokaza- łem na rysunku na następnej stronie. 122 Poleć książkęKup książkę Rozdział 4. • Utworzenie witryny społecznościowej Teraz zajmiemy się umożliwieniem użytkownikom edycji profilu w witrynie internetowej. Dodaj poniższe formularze modelu do pliku forms.py aplikacji account. from .models import Profile class UserEditForm(forms.ModelForm): class Meta: model = User fields = ( first_name , last_name , email ) class ProfileEditForm(forms.ModelForm): class Meta: model = Profile fields = ( date_of_birth , photo ) Oto krótkie omówienie dodanych formularzy.  UserEditForm. Formularz pozwala użytkownikowi na edycję imienia, nazwiska i adresu e-mail. Wymienione informacje są przechowywane we wbudowanym w Django modelu User.  ProfileEditForm. Formularz pozwala użytkownikowi na edycję danych dodatkowych, które zostaną zapisane w modelu Profile. Użytkownik będzie mógł podać datę urodzenia i wczytać obraz (tzw. awatar) dla swojego profilu. Przeprowadź edycję pliku views.py aplikacji account i zaimportuj
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Django 2. Praktyczne tworzenie aplikacji sieciowych. Wydanie II
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: