Heim >Backend-Entwicklung >Python-Tutorial >Django-Benutzerauthentifizierungssystem (2) Authentifizierung in Webanfragen
Geben Sie in jeder Webanfrage ein request.user-Attribut an, um den aktuellen Benutzer darzustellen. Wenn der aktuelle Benutzer nicht angemeldet ist, ist dieses Attribut eine Instanz von AnonymousUser, andernfalls eine User-Instanz.
Sie können es anhand von is_authenticated() unterscheiden, zum Beispiel:
if request.user.is_authenticated():
# Etwas für authentifizierte Benutzer tun.
else:
# Etwas für anonyme Benutzer tun.
Login login
login()
Die Login-Funktion erfordert ein HttPRequest-Objekt und ein User-Objekt als Parameter. login() verwendet das Sitzungsframework von Django, um die Benutzer-ID in der Sitzung zu speichern.
Authenticate() und login() gleichzeitig verwenden:
from django.contrib.auth import Authenticate, login
def my_view(request):
Benutzername = request .POST['username']
passWord = request.POST['password']
user = Authenticate(username=Benutzername, Passwort=Passwort)
wenn der Benutzer nicht None ist:
if user. is_active:
login(request, user)
# Eine Fehlermeldung „Ungültige Anmeldung“ zurückgeben.
Abmelden
logout()
Verwendet das HttpRequest-Objekt als Parameter und hat keinen Rückgabewert. Zum Beispiel:
from django.contrib.auth import logout
def logout_view(request):
logout(request) # Weiterleitung zu einer Erfolgsseite.
Zugriff einschränken
Der einfache Weg
Verwenden Sie request.user.is_authenticated()
Umleitung:
von django.shortcuts Import Redirect
def my_view(request):
if not request.user.is_authenticated(): return restart('/login/?next=%s' % request.path)
# ...
oder:
from django.shortcuts import render
def my_view(request):
if not request.user.is_authenticated() : return render(request, 'myapp/login_error.html')
# ...
Verwenden Sie den Dekorator login_required
login_required([redirect_field_name=REDIRECT_FIELD_NAME, login_url=Keine]
von django.contrib.auth.decorators import login_required
@login_required
def my_view(request): ...
Wenn der Benutzer nicht angemeldet ist, leiten Sie zu „settings.LOGIN_URL“ weiter und hängen Sie den relativen Pfad der aktuellen URL an, um als Schlüssel ein Abfragezeichenpaar zu bilden, und hängen Sie es an „settings.LOGIN_URL“ an:
/accounts /login/ ?next=/polls/3/.
von django.contrib.auth .decorators import login_required
@login_required(redirect_field_name='my_redirect_field')
def my_view(request): ...
Sie können login_url auch selbst definieren:
von django.contrib.auth.decorators import login_required
@login_required(login_url='/accounts/login/')
def my_view(request): ...
Erforderliche Definitionen in urls.py:
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
Um beispielsweise die E-Mail-Adresse des Benutzers zu erkennen:
def my_view(request):
wenn nicht „@example.com“ in request.user .email:return HttpResponse („Sie können in dieser Umfrage nicht abstimmen.“)
# ...
Sie können Dekoratoren verwenden:
von Django .contrib.auth.decorators import user_passes_test
def email_check(user):
return '@example.com' in user.email
@user_passes_test(email_check)
def my_view (Anfrage):
...
Authentifizierungsansichten
Natürlich können wir einige Ansichtsfunktionen für die Anmeldung, Abmeldung und Passwortverwaltung selbst definieren, und das ist auch der Fall bequemer.
Aber Sie können auch mehr über die integrierten Ansichten von Django erfahren.
Django stellt keine Standardvorlage für Authentifizierungsansichten bereit, der Vorlagenkontext ist jedoch für jede Ansicht unten dokumentiert.
Alle integrierten Ansichten geben eine TemplateResponse-Instanz zurück, sodass Sie diese einfach anpassen können Antwortdaten.
def login(request, template_name='registration/login.html',
redirect_field_name=REDIRECT_FIELD_NAME,
authentication_form=AuthenticationForm,
current_app=None, extra_context=None):
"""
Zeigt das Anmeldeformular an und verarbeitet die Anmeldeaktion.
"""
redirect_to = request.POST.get(redirect_field_name,
request.GET.get(redirect_field_name, ''))
if request.method == "POST":
form = Authentication_form(request, data=request.POST)
if form.is_valid():
# Stellen Sie sicher, dass der Benutzer stammt Weiterleitungs-URL ist sicher.
falls nicht is_safe_url(url=redirect_to, host=request.get_host()):
redirect_to =solve_url(settings.LOGIN_REDIRECT_URL)
# Okay , Sicherheitskontrolle abgeschlossen. Melden Sie den Benutzer an.
auth_login(request, form.get_user())
return HttpResponseRedirect(redirect_to)
else:
form = Authentication_form(request)
aktuelle_Seite = get_current_site(request)
context = {
'form': form,
redirect_field_name: restart_to,
'site': current_site,
'site_name': current_site.name,
}
wenn extra_context nicht None ist:
context.update(extra_context)
return TemplateResponse(request, template_name, context,
)
URL-Name: login
参数:
template_name: 默认的登陆模板.默认为registration/login.html.
redirect_field_name: 重定向的name,默认为next.
Authentication_form: Anmeldeformular. Der Standardwert ist AuthenticationForm.
current_app: Ein Hinweis, der angibt, welche Anwendung die aktuelle Ansicht enthält. Weitere Informationen finden Sie in der Namespace-URL-Auflösungsstrategie.
extra_context: 添加到默认context data中的额外数据,为字典。
django.contrib.auth.views.login tut:
如果通过GET访问, 将显示登录表单, 可以将其内容POST到相同的URL上.
如果通过POST访问,它首先会尝试登录, 如果成功, view就重定向到next指定的的链接.如果next 未设置,则重定向到settings.LOGIN_REDIRECT_URL(一般缺省值为accounts/profile/)。如果登录失败,则再次显示登录表单.
需要用户自己来提供login的html模板,缺省是registration/login.html Die Abfragezeichenfolge wird angezeigt中
site: 当前网站,根据 SITE_ID 设置。如果你并没有安装site框架,这个变量将设定为个. RequestSite实例,它从当前 HttpRequest中取得站点名和域名.site_name: 是 site. name的一个别名.如果你没有安装site框架,它将会被设为 request.META['SERVER_NAME']的值。
如果你不想调用registration/login.html模板, 你可以在URLconf中设定特定的view参数来传递template_name参数.
你也可以自己指定重定向链接字段名,通过redirect_field_name.默认的字段名为next.
{% erweitert "base.html" %}
{% Blockinhalt %}
{% if form.errors %}
Ihr Benutzername und Ihr Passwort stimmt nicht überein. Bitte versuchen Sie es erneut.
Wenn Sie das Authentifizierungssystem anpassen, können Sie das benutzerdefinierte Authentifizierungsformular über den Parameter „authentication_form“ an die Anmeldeansicht übergeben. Die __init__-Methode des Formulars sollte einen Anforderungsparameter haben und eine get_user-Methode bereitstellen, um das authentifizierte Benutzerobjekt zurückzugeben.
logout(request[, nächste_Seite, Vorlagenname, Weiterleitungsfeldname, aktuelle_App,extra_context])
Benutzer abmelden.
URL-Name: Abmelden
Optionale Parameter :
next_page: Link nach dem Abmelden umleiten.
logout_then_login(request[, login_url, current_app, extra_context])
Benutzer abmelden und dann zum Anmeldelink weiterleiten.
Optionale Parameter:
login_url: Weiterleitungslink zur Anmeldeseite, der Standardwert ist Settings.LOGIN_URL.
password_change(request[, template_name, post_change_redirect,password_change_form,current_app, extra_context])
Ermöglicht Benutzern das Ändern von Passwörtern.
URL-Name: password_change
Ja Optionale Argumente:
template_name: Vorlagenname, der Standardwert ist Registration/password_change_form.html.
post_change_redirect: Weiterleitungslink.
password_change_form: Benutzerdefiniertes Passwortänderungsformular, einschließlich eines Benutzerparameters. Der Standardwert ist PasswordChangeForm.
password_change_done(request[, template_name,current_app, extra_context])
Die Seite, nachdem der Benutzer das Passwort geändert hat.
URL-Name: password_change_done
Optionale Argumente:
template_name: Vorlagenname, Standard ist Registration/password_change_done.html.
password_reset(request[, is_admin_site, template_name, email_template_name, password_reset_form, token_generator, post_reset_redirect, from_email, current_app, extra_context, html_email_template_name])
Senden Sie eine E-Mail an den Benutzer, die einen einmaligen Link enthält, über den der Benutzer sein Passwort zurücksetzen kann.
Wenn die angegebene E-Mail-Adresse nicht existiert, wird sie nicht gesendet.
URL-Name: passwort_reset
Optionale Argumente Optionale Argumente:
template_name: Vorlagenname, der Standardwert ist Registration/password_reset_form.html.
email_template_name: Der Vorlagenname, der zum Generieren von E-Mails mit Aufladelinks verwendet wird. Der Standardwert ist Registration/password_reset_email.html.
subject_template_name: Der Name der Vorlage, die zum Generieren von E-Mail-Betreffern verwendet wird. Der Standardwert ist Registration/password_reset_subject.txt.
password_reset_form: Formular zum Zurücksetzen des Passworts, der Standardwert ist PasswordResetForm. PasswordResetTokenGenerator.
post_reset_redirect: Umleitungslink nach dem Zurücksetzen des Passworts.
from_email: E-Mail-Adresse, der Standardwert ist DEFAULT_FROM_EMAIL.
current_app: Ein Hinweis, der angibt, welche Anwendung enthält Weitere Informationen finden Sie in der Namespace-URL-Auflösungsstrategie.
html_email_template_name: Der vollständige Name einer Vorlage an Zum Generieren einer mehrteiligen Text-/HTML-E-Mail mit dem Link zum Zurücksetzen des Passworts verwenden. Standardmäßig wird keine HTML-E-Mail gesendet.
Beispiel: Registration/password_reset_email.html (E-Mail-Inhaltsvorlage):
Jemand Bitte um Passwort-Zurücksetzung für E-Mail {{ email }}. Folgen Sie dem Link unten:
{{ Protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
password_reset_done(request[, template_name])
Zeigt die Seite an, nachdem der Benutzer sich dafür entschieden hat, eine E-Mail zum Zurücksetzen des Passworts zu senden. Wenn der post_reset_redirect-Link nicht explizit in der Ansicht „password_reset()“ angegeben ist, wird diese Ansicht direkt aufgerufen.
password_reset_confirm(request[, uidb36, token, template_name, token_generator,set_password_form, post_reset_redirect,current_app, extra_context])
Zeigt das Formular zur Eingabe des neuen Passworts an.
password_reset_complete (request [, template_name, current_app, extra_context])
Das Formular nach einem erfolgreichen Passwort-Reset.
Hilfsfunktionen
redirect_to_login(next[, login_url, restart_field_name])
Weiterleitung zur Anmeldeseite. Nach erfolgreicher Anmeldung auf einen anderen Link umleiten. .
Parameter:
nächster: Link nach erfolgreicher Anmeldung.
login_url: Link zur Anmeldeseite, Standardwert: Settings.LOGIN_URL.
redirect_field_name: Name des Weiterleitungsfelds, der Standardwert ist next.
Eingebaute Formulare
Klasse AdminPasswordChangeForm
Formular zur Änderung des Passworts des Administrator-Hintergrundbenutzers
Klasse AuthenticationForm
Anmeldeformular.
Methode bestätigen_login_allowed(Benutzer)
Erlauben Sie beispielsweise allen Benutzern, sich anzumelden, unabhängig vom is_active-Attribut:
aus django.contrib.auth.forms import AuthenticationForm
class AuthenticationFormWithInactiveUsersOkay(AuthenticationForm):
def activate_login_allowed(self, user):
pass
oder nur aktiven Benutzern die Anmeldung erlauben:
Klasse PickyAuthenticationForm(AuthenticationForm):
def activate_login_allowed(self, user):
if not user.is_active:
raise forms.ValidationError(
) _("Dieses Konto ist inaktiv."),
code='inactive' ,
)
if user.username.startswith('b'):
' s bis ‐ off ‐ ‐ ‐ ‐ („Entschuldigung, Konten, die mit „b“ beginnen, sind nicht verfügbar "Hier nicht willkommen.")
🎜>Passwort-Reset-Formular.
Klasse SetPasswordForm
Beim Rendern der Vorlage RequestContext wird der aktuell angemeldete Benutzer, unabhängig davon, ob es sich um eine Benutzerinstanz oder eine AnonymousUser-Instanz handelt, in der Vorlage gespeichert Variable {{ user }}:
{% if user .is_authenticated %}
Willkommen, {{ user.username }} Vielen Dank für die Anmeldung.
{% else %}
Willkommen, neuer Benutzer. Bitte melden Sie sich an.
{% endif %}
Diese Variable existiert nicht, wenn RequestContext wird nicht verwendet.
RequestContext verwenden:
from django.shortcuts import render_to_response
from django.template import RequestContext
def some_view(request):
# ...
return render_to_response('my_template.html',
Das Obige ist das Django-Benutzerauthentifizierungssystem (2) Authentifizierungsinhalt in Webanfragen Inhalt, achten Sie bitte auf die chinesische PHP-Website (www.php.cn)!