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 urlpatterntil 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 urlpatterntil 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 urlpatternfor / i mysite / urls.py, så inkluder følgende urlpatterni 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 homehenviser til visningen for / og registerhenviser 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, passwordog de variable opgaver at gøre netop det. forms.CharFieldrepræsenterer et felt sammensat af tegn. Argumenterne - required, max_lengthog label- angiver, om et felt er påkrævet, dets maksimale længde og feltets etiket. Widgetparameteren i passwordsiger, at det passworder 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 userObjordbog, som vi får ved at anvende cleaned_datapå formularen og uddrag username, emailog passwordfra 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 :)