Sådan håndteres brugergodkendelse i Python Django

I denne vejledning viser jeg, hvordan man bruger login, logout og tilmelding i Django. Al den kode, som jeg beskriver her, findes i dette GitHub-lager. Denne tutorial bruger Python 2.7 og Django 1.9.
Projektinstallation og struktur
For at komme i gang skal du køre følgende kommandoer fra terminalen:
django-admin startproject src cd src python manage.py startapp mysite python manage.py migrate
I en nøddeskal opretter disse fire kommandoer et nyt Django-projekt ved navn src, indtast projektet, opret en ny app, mysite, inde i src-projektet, og opret derefter en SQLite-database til projektet db.sqlite3. Sørg også for at medtage mysite-appen i src / settings.py.
INSTALLED_APPS = [ 'src', 'django.contrib.admin', 'django.contrib.auth', ... ]
Opret en mappe, der hedder skabeloner i mysite-appen. Opret derefter to andre mapper inde i mysite / skabeloner med navnet “registrering” og “mysite”.
Jeg vil også henvise til de skabeloner, der er gemt i disse to mapper, ved hjælp af registrering / {template_name} og mysite / {template_name}.
Din projektstruktur skal i sidste ende se sådan ud:
. |-- db.sqlite3 |-- manage.py |-- mysite | |-- admin.py | |-- apps.py | |-- __init__.py | |-- migrations | | `-- __init__.py | |-- models.py | |-- templates | | |-- mysite | | `-- registration | |-- tests.py | `-- views.py `-- src |-- __init__.py |-- settings.py |-- urls.py `-- wsgi.py
Du er muligvis allerede i stand til at finde ud af, hvad skabelonerne på mit websted kan bruges til (visninger defineret i mit websted for eksempel). Vi kommer snart til vigtigheden af registrering.
Vi har også brug for brugere til at teste vores websted. Du kan gøre dette ved at oprette en superbruger ( python manage.py createsuperuser
). Men rolig - alt, hvad denne tutorial beskriver, kan også anvendes til normale brugere uden ændringer. Du kan oprette normale brugere med henblik på denne tutorial ved at oprette en superbruger, køre din udviklingsserver ( python manage.py runserver
), navigere til localhost: 8000 / admin, navigere til brugere og derefter oprette en ny bruger.
Håndtering af login
Ifølge dokumentationen giver Django visninger til håndtering af brugergodkendelsesmetoder som login, logout og gendannelse af adgangskode. Dette sparer os besværet med at skulle gennemgå vores egne synspunkter for håndtering af disse ting. Desuden er disse visninger ret konfigurerbare og er inkluderet i django.contrib.auth.views, som vi importerer som følger:
from django.contrib.auth import views as auth_views
Vi ønsker, at login-siden skal åbnes, når brugeren går til / login. For at bruge loginvisningen tilføj følgende i src / urls.py
url(r'^login/$', auth_views.login),
Visningen gengiver som standard en skabelon, der er i registrering / login.html.
Vores registrering / login.html inkluderer følgende enkle HTML-formular:
Login {% csrf_token %} Username
Password
Login
Vil du ikke bruge registrering / login.html? Du kan angive, hvilke skabeloner der skal bruges ved at give en pythonordbog som en tredje parameter i urlpattern med 'template_name' som nøgle og placeringen af skabelonen som værdi. Hvis du vil bruge mysite / login_user.html som skabelon:
url(r'^login/$', auth_views.login, {'template_name': 'mysite/login_user.html'})
Derudover kan du også bruge andre argumenter i visningen på stort set samme måde. For en komplet liste over argumenter henvises til doku- menterne.
Når brugeren klikker på knappen Send, håndterer loginvisningen login for os. Når brugeren har logget ind, kan vi definere, hvor siden skal omdirigeres ved at specificere LOGIN_REDIRECT_URL i src / settings.py. Som standard omdirigeres vi til / login, hvis login mislykkes.
LOGIN_REDIRECT_URL = '/'
Kør nu udviklingsserveren ( python manage.py runserver
) og naviger til localhost: 8000 / login /. Indtast brugeroplysningerne for din eksempel-superbruger. Du omdirigeres til / hvis login var vellykket. Ellers omdirigeres du til / login.
Selvom dit login lykkedes, omdirigeres du til / og ser en fejl. Dette vil ske, fordi vi ikke har defineret en urlpattern
til det.
Håndtering af logout
Dernæst ønsker vi, at brugerne logger ud, når de navigerer til / logger ud. Vi kan udvide den samme analogi som login til logout, få adgang til den visning, der svarer til logout ved at tilføje følgende urlpattern til src / settings.py
url(r'^logout/$', auth_views.logout)
Logoutvisningen gengiver som standard registrerings- / logget_out.html-skabelonen. Her er en simpel logout-skabelon:
You have successfully logged out. Home
Som ved login kan du ændre skabelonplaceringen ved at medtage et objekt med en 'skabelonnavn' -tast og skabelonens placering som værdi.
Tilmelde
Vi ønsker, at vores brugere skal tilmelde sig vores websted ved at navigere til / registrere. Før vi gør det, lad os rydde op i projektet lidt. Først og fremmest ønsker vi en urlpattern
til vores hjemmeside /. Vi skal bruge mysite-appen til dette formål, så tilføj følgende i src / urls.py
url(r'^', include('mysite.urls'))
Nu skal vi medtage urlpattern
for / i mysite / urls.py, så inkluder følgende urlpattern
i det (efter import af de relevante biblioteker)
from django.conf.urls import url, include from django.contrib import admin from .views import home, register urlpatterns = [ url(r'^$', home), url(r'^register/', register), ]
Her home
henviser til visningen for / og register
henviser til visningen til håndtering af registrering. Til oprettelse af en brugerregistreringsformular bruger vi Django i indbyggede formularer. For at gøre dette skal du oprette en mysite / forms.py-fil og inkludere følgende:
from django import forms class UserRegistrationForm(forms.Form): username = forms.CharField( required = True, label = 'Username', max_length = 32 ) email = forms.CharField( required = True, label = 'Email', max_length = 32, ) password = forms.CharField( required = True, label = 'Password', max_length = 32, widget = forms.PasswordInput() )
Først importerer vi formularbiblioteket, vi opretter UserRegistrationForm
, som arver fra forms.Form
. Vi ønsker, at vores formularer at have 3 felter: username
, email
, password
og de variable opgaver at gøre netop det. forms.CharField
repræsenterer et felt sammensat af tegn. Argumenterne - required
, max_length
og label
- angiver, om et felt er påkrævet, dets maksimale længde og feltets etiket. Widgetparameteren i password
siger, at det password
er et input af typen "adgangskode".
Vi ønsker, at brugerne skal kunne se formularen, hvis de går til / registrerer, samt udfylde den og indsende den. Disse svarer til GET- og POST-anmodninger om / register. Således inkluderer vi følgende i mysite / views.py:
from django.shortcuts import render from django.contrib.auth.models import User from django.contrib.auth import authenticate, login from django.http import HttpResponseRedirect from django import forms from .forms import UserRegistrationForm # Create your views here. def home(request): return render(request, 'mysite/home.html') def register(request): if request.method == 'POST': form = UserRegistrationForm(request.POST) if form.is_valid(): userObj = form.cleaned_data username = userObj['username'] email = userObj['email'] password = userObj['password'] if not (User.objects.filter(username=username).exists() or User.objects.filter(email=email).exists()): User.objects.create_user(username, email, password) user = authenticate(username = username, password = password) login(request, user) return HttpResponseRedirect('/') else: raise forms.ValidationError('Looks like a username with that email or password already exists') else: form = UserRegistrationForm() return render(request, 'mysite/register.html', {'form' : form})
Hjemvisningen er defineret til at gengive src / home.html-skabelonen, som er som følger:
Home {% if user.is_authenticated %} hello
welcome {{ user.username }}
Logout
{% else %} Login
Register
{% endif %}
We check whether the user is logged in, using user.is_authenticated, and display our welcome text along with the username (using user.username
) along with a link for logging out. If not, we will display links for logging in and registering.
For the register view, we check whether the request method is POST or not. If it isn’t, then we specify the form to be UserRegistrationForm
and render, it by passing it as a parameter to mysite/register.html template:
{% csrf_token %} {{ form.as_p }} Submit
The form that is passed as input to the register view is then rendered using form.as_p
. When the user clicks the submit button, a POST request is sent. We take the form data using the form variable.
Dernæst kontrollerer vi, om formulardataene er gyldige (gennem is_valid()
). Hvis det er tilfældet, opretter vi en userObj
ordbog, som vi får ved at anvende cleaned_data
på formularen og uddrag username
, email
og password
fra den.
Hvis-betingelsen kontrollerer, om det er tilfældet, at der findes en bruger med samme brugernavn og e-mail i vores database. Hvis det er tilfældet, opretter vi en ny bruger, logger ind med den samme bruger og omdirigeres til /. Ellers rejser vi en fejl, der siger, at en sådan bruger allerede eksisterer.
Her er noget relevant dokumentation, hvis du sidder fast eller ønsker at lære mere:
- Brugergodkendelse
- Formularer
Hvis du vil give mig feedback om denne tutorial, så kontakt mig.
Hvis du kunne lide dette indlæg, så venligst ♡ det og del det :)