Strana „Moj profil“
Napravi zaštićenu stranu /nalozi/profil/ koja prikazuje korisničko ime, datum registracije, broj sačuvanih logoa i link za promenu lozinke.
Za prijavu i odjavu ne pišemo pogled – Django ih ima gotove (LoginView, LogoutView). Dovoljno je uključiti njihove adrese i napraviti šablon. Zatim zaključavamo strane koje smeju da vide samo prijavljeni korisnici.
Red path("nalozi/", include("django.contrib.auth.urls")) iz glavnog urls.py uključuje:
| Adresa | Ime rute | Šta radi |
|---|---|---|
/nalozi/login/ | login | forma za prijavu |
/nalozi/logout/ | logout | odjava (samo POST) |
/nalozi/password_change/ | password_change | promena lozinke |
/nalozi/password_reset/ | password_reset | zaboravljena lozinka (zahteva slanje email-a) |
Kuda se ide posle prijave i odjave određuju LOGIN_REDIRECT_URL i LOGOUT_REDIRECT_URL iz lekcije 3; LOGIN_URL = "login" kaže kuda se šalje neprijavljen korisnik.
{# templates/registration/login.html – ovo ime i mesto traži Django-ov LoginView #}
{% extends "base.html" %}
{% block naslov %}Prijava – Logo Kreator{% endblock %}
{% block sadrzaj %}
<div class="container py-4" style="max-width: 420px">
<h1 class="h3 mb-3">Prijava</h1>
{% if form.non_field_errors %}
<div class="alert alert-danger">Pogrešno korisničko ime ili lozinka.</div>
{% endif %}
<form method="post">
{% csrf_token %}
<div class="mb-3">
<label for="id_username" class="form-label">Korisničko ime</label>
<input type="text" name="username" id="id_username" class="form-control" required autofocus>
</div>
<div class="mb-3">
<label for="id_password" class="form-label">Lozinka</label>
<input type="password" name="password" id="id_password" class="form-control" required>
</div>
<input type="hidden" name="next" value="{{ next }}">
<button class="btn btn-danger w-100">Prijavi se</button>
</form>
<p class="mt-3 small">Nemaš nalog? <a href="{% url 'registracija' %}">Registruj se</a>.</p>
</div>
{% endblock %}
LoginView traži šablon registration/login.html i šalje mu formu pod imenom form i adresu povratka next. Ako su podaci pogrešni, form.non_field_errors nije prazno. Poruka namerno ne kaže da li je pogrešno ime ili lozinka – tako napadač ne može da sazna koja korisnička imena postoje.
Od Django-a 5.0 odjava radi samo na POST zahtev. Da je dovoljan link (GET), tuđa stranica bi mogla da te odjavi skrivenom slikom sa tom adresom (CSRF). Zato je u base.html odjava mala forma sa dugmetom:
<form method="post" action="{% url 'logout' %}" class="d-inline">
{% csrf_token %}
<button class="btn btn-link nav-link">Odjava ({{ user.username }})</button>
</form>
Stari primeri sa <a href="/logout/"> u novim verzijama vraćaju grešku 405 (Method Not Allowed).
from django.contrib.auth.decorators import login_required
@login_required # neprijavljen korisnik ide na /nalozi/login/?next=/moji-logoi/
def moji_logoi(request):
logoi = request.user.logoi.all()
return render(request, "logoi/moji_logoi.html", {"logoi": logoi})
| Proverom | Gde | Primer |
|---|---|---|
@login_required | pogled | cela strana samo za prijavljene |
request.user.is_authenticated | pogled | isti pogled radi različito (generator: čuvanje samo za prijavljene) |
{% if user.is_authenticated %} | šablon | šta se prikazuje u meniju |
get_object_or_404(..., vlasnik=request.user) | pogled | korisnik dobija samo svoje podatke (lekcija 8) |
U videu je pogled za prijavu napisan ručno (authenticate + login). To je dobro za razumevanje, ali gotov LoginView je kraći i sigurniji.
Za svaki zadatak postoji primer, uputstvo i rešenje.
Napravi zaštićenu stranu /nalozi/profil/ koja prikazuje korisničko ime, datum registracije, broj sačuvanih logoa i link za promenu lozinke.
templates/registration/login.html.next na tuđe sajtove – Django-ov LoginView to sam proverava, ručno napisan pogled mora i to da proveri.1. Zašto odjava u Django-u 5 radi samo POST zahtevom?
2. Šta radi @login_required?
3. Da li je dovoljno sakriti link u meniju da bi strana bila zaštićena?
Pri kucanju url-a localhost:8000/prijava pozvaće se funkcija prijava_korisnika u okviru view.py fajla.
i u nastavku, drugi deo fajla:
POST zahtev će se desiti tek kada sa forme koja se nalazi na strani za logovanje bude kliknuto dugme submit. Tada će se pokupiti username i password i pozvati Djangova funkcija authenticate(kojoj se kao parametri šalju korisničko ime i šifra. Ako se ovi podaci nalaze u bazi, tj. ako je korisnik prethodno registrovan ova funkcija će vratiti model korisnika.
i u nastavku drugi deo strane:
Korisnik koji nije ulogovan kliknuće na link