8.2. Czat (cz. 2)

Dodawanie, edycja, usuwanie czy przeglądanie danych zgromadzonych w bazie są typowymi czynnościami w aplikacjach internetowych. Utworzony w scenariuszu Czat (cz. 1) kod ilustruje „ręczną” obsługę żądań GET i POST, w tym tworzenie formularzy, walidację danych itp. Django zawiera jednak gotowe mechanizmy, których użycie skraca i ulepsza pracę programisty eliminując potencjalne błędy.

Będziemy rozwijać kod uzyskany po zrealizowaniu punktów 8.1.1 – 8.1.10 scenariusza Czat (cz. 1). Pobierz więc archiwum i rozpakuj w katalogu domowym użytkownika. Następnie wydaj polecenia:

Terminal nr
~$ source pve3/bin/activate
(pve3) ~$ cd czat2
(pve3) ~/czat2$ python manage.py check

Ostrzeżenie

Przypominamy, że pracujemy w wirtualnym środowisku Pythona z zainstalowanym frameworkiem Django, które powinno znajdować się w katalogu pve3. Zobacz w scenariuszu Czat (cz. 1), jak utworzyć takie środowisko.

8.2.1. Rejestrowanie

Na początku zajmiemy się obsługą użytkowników. Umożliwimy im samodzielne zakładanie kont w serwisie, logowanie i wylogowywanie się. Inaczej niż w cz. 1 zadania te zrealizujemy za pomocą tzw. widoków wbudowanych opartych na klasach (ang. class-based generic views).

Na początku pliku czat2/czat/urls.py importujemy formularz tworzenia użytkownika (UserCreationForm) oraz wbudowany widok przeznaczony do dodawania danych (CreateView):

Plik urls.pyKod nr
6from django.contrib.auth.forms import UserCreationForm
7from django.views.generic.edit import CreateView

Następnie do listy urlpatterns dopisujemy:

Plik urls.pyKod nr
18    url(r'^rejestruj/', CreateView.as_view(
19        template_name='czat/rejestruj.html',
20        form_class=UserCreationForm,

Powyższy kod łączy adres URL /rejestruj z wywołaniem widoku wbudowanego jako funkcji CreateView.as_view(). Przekazujemy jej trzy parametry:

  • template_name – szablon, który zostanie użyty do zwrócenia odpowiedzi;

  • form_class – formularz, który zostanie przekazany do szablonu;

  • success_url – adres, na który nastąpi przekierowanie w przypadku braku błędów (np. po udanej rejestracji).

Teraz tworzymy szablon formularza rejestracji, który zapisać należy w pliku templates/czat/rejestruj.html:

Plik rejestruj.htmlKod nr
 1<!-- templates/czat/rejestruj.html -->
 2<html>
 3  <body>
 4    <h1>Rejestracja użytkownika</h1>
 5    {% if user.is_authenticated %}
 6      <p>Jesteś już zarejestrowany jako {{ user.username }}.
 7      <br /><a href="/">Strona główna</a></p>
 8    {% else %}
 9    <form method="POST">
10      {% csrf_token %}
11      {{ form.as_p }}
12      <button type="submit">Zarejestruj</button>
13    </form>
14    {% endif %}
15  </body>
16</html>

Na koniec wstawimy link na stronie głównej, a więc uzupełniamy plik index.html:

Plik index.htmlKod nr
 1<!-- templates/czat/index.html -->
 2<html>
 3  <head></head>
 4  <body>
 5    <h1>Witaj w aplikacji Czat!</h1>
 6
 7    {% if user.is_authenticated %}
 8      <p>Jesteś zalogowany jako {{ user.username }}.</p>
 9    {% else %}
10      <p><a href="{% url 'czat:rejestruj' %}">Zarejestruj się</a></p>
11    {% endif %}
12
13  </body>
14</html>

Ćwiczenie: dodaj link do strony głównej w szablonie rejestruj.html.

Uruchom aplikację (python manage.py runserver) i przetestuj dodawanie użytkowników: spróbuj wysłać niepełne dane, np. bez hasła; spróbuj dodać dwa razy tego samego użytkownika.

../../_images/django_rejestracja.png

8.2.2. Wy(logowanie)

Na początku pliku urls.py aplikacji dopisujemy wymagany import:

Kod nr
8from django.core.urlresolvers import reverse_lazy
9from django.contrib.auth import views as auth_views

– a następnie:

Plik urls.pyKod nr
22    url(r'^loguj/', auth_views.login,
23        {'template_name': 'czat/loguj.html'},
24        name='loguj'),
25    url(r'^wyloguj/', auth_views.logout,
26        {'next_page': reverse_lazy('czat:index')},
27        name='wyloguj'),

Widać, że z adresami /loguj i /wyloguj wiążemy wbudowane w Django widoki login i logout importowane z modułu django.contrib.auth.views. Jedynym nowym parametrem jest next_page, za pomocą którego wskazujemy stronę wyświetlaną po wylogowaniu (reverse_lazy('czat:index')).

Logowanie wymaga szablonu loguj.html, który tworzymy i zapisujemy w podkatalogu templates/czat:

Plik loguj.htmlKod nr
 1<!-- templates/czat/loguj.html -->
 2<html>
 3  <body>
 4    <h1>Logowanie użytkownika</h1>
 5    {% if user.is_authenticated %}
 6      <p>Jesteś już zalogowany jako {{ user.username }}.
 7      <br /><a href="/">Strona główna</a></p>
 8    {% else %}
 9    <form method="POST">
10      {% csrf_token %}
11      {{ form.as_p }}
12      <button type="submit">Zaloguj</button>
13    </form>
14    {% endif %}
15  </body>
16</html>

Musimy jeszcze określić stronę, na którą powinien zostać przekierowany użytkownik po udanym zalogowaniu. W tym wypadku na końcu pliku czat2/settings.py definiujemy wartość zmiennej LOGIN_REDIRECT_URL:

Plik settings.py. Kod nr
# czat2/settings.py

from django.core.urlresolvers import reverse_lazy
LOGIN_REDIRECT_URL = reverse_lazy('czat:index')

Ćwiczenie: Uzupełnij plik index.html o linki służące do logowania i wylogowania.

../../_images/django_logowanie.png