Django笔记–Django的Auth组件(用户认证)
这篇文章来记录我学习Django中的Auth组件。
Django提供了一个强大的用户认证系统–Auth组件,对于实现用户认证的登录功能会更加方便。
导入auth模块与其相应内容
from django.contrib import auth #导入auth模块
from django.contrib.auth.models import User #导入数据库(用户数据储存在auth_user中)
from django.contrib.auth.decorators import login_required #导入装饰器login_required
auth组件中方法以及描述:
auth中的方法 | 描述 |
---|---|
authenticate(request,username=*,password=*) | 登录验证(若输入的账号密码正确,则返回一个对象。否则返回None) |
login(request,userobj) | 记录userobj对象用户的登录状态(登录) |
logout(request) | 退出目前登录用户的登录状态(注销) |
is_authenticated() | 判断目前用户是否通过登录认证 |
@login_required | 登录判断的装饰器(未登录则跳转到默认的URL“/accounts/login/”中,并会记录当前访问的url路径)(下面有补充!!!) |
create_user(username = *, password = *) | 创建普通用户 |
create_superuser(username=*,password=*,email=*) | 创建超级用户 |
check_password(password) | 判断当前登录用户的面是否与输入值相同(相同返回True,否则返回False) |
set_password(password) | 修改当前登录用户的密码 |
对@login_required装饰器的补充,在未登录的默认跳转URl路径为/accounts/login/。其路径可以在settings.py中添加以下设置来修改设定(修改成默认URL路径为/login/)。
LOGIN_URL = '/login/'
用户数据库(auth_user)中用户属性的部分介绍:
- is_superuser:是否为超级管理员,more power
- is_staff:是否可以登录管理页面(admin),可以登录但没有权限
- is_active:是否允许用户登录
下面实战利用Auth组件实战操作,结合上Form组件简单制作了一个带有登录,注册,注销,修改密码功能的系统。
(路由)urls.py
from django.contrib import admin
from django.urls import path
from firstapp import views
urlpatterns = [
path('admin/', admin.site.urls), #管理页面
path('register/', views.register), #注册
path('login/',views.login), #登录
path('index/',views.index), #大厅
path('logout/', views.logout), #注销
path('changepassword/', views.changepassword), #修改密码
]
(校验)forms.py
from django import forms
from django.forms import widgets
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
class RegForm(forms.Form):
username = forms.CharField(
label="用户名",
min_length=2,
max_length=6,
error_messages={
'min_length': '用户名的长度不能小于2',
'max_length':'用户名的长度不能大于6',
'required':'用户名不能为空',
}
)
password = forms.CharField(
label="密码",
widget=forms.widgets.PasswordInput(),
error_messages={
'required': '密码不能为空',
}
)
re_password = forms.CharField(
label="确认密码",
widget=forms.widgets.PasswordInput(),
error_messages={
'required': '密码不能为空',
}
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields:
self.fields[field].widget.attrs.update({
'class': 'form-control'})
def clean(self):
pwd = self.cleaned_data.get('password')
re_pwd = self.cleaned_data.get('re_password')
if pwd == re_pwd:
return self.cleaned_data
self.add_error('re_password', '两次密码不一致')
raise ValidationError('两次密码不一致')
class LogForm(forms.Form):
username = forms.CharField(
label="用户名",
error_messages={
'required':'用户名不能为空',
}
)
password = forms.CharField(
label="密码",
widget=forms.widgets.PasswordInput(),
error_messages={
'required': '密码不能为空',
}
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields:
self.fields[field].widget.attrs.update({
'class': 'form-control '})
(视图)views.py
from django.shortcuts import render,HttpResponse,redirect
from firstapp.forms import RegForm,LogForm
from django.contrib import auth
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
def register(request): #注册函数
form_obj = RegForm()
if request.method == 'POST':
form_obj = RegForm(request.POST)
if form_obj.is_valid():
username=request.POST.get('username')
password =request.POST.get('password')
User.objects.create_user(username = username, password = password)
return redirect('/login/')
return render(request, 'register.html', {