一. 概要
# auto模块是Django提供的标准权限管理系统,可以提供身份认证,用户组和权限管理
# 主要的操作包括:
'''
1.create_user 创建用户
2.authenticate 验证登录
3.login 记住用户的登录状态
4.logout 退出登录
5.is authenticated 判断用户是否登录
6.@login_required 判断用户是否登录的装饰器
'''
二. 配置
# 1. 创建模型类,继承: AbstractUser
class User(AbstractUser):
username = models.CharField(max_length=30, unique=True, null=False)
password = models.CharField(max_length=128)
class Meta:
db_table = "user"
'''
数据库迁移指令
python manage.py makemigrations
python manage.py migrate
'''
# 2. settings.py中指定认证系统路径
AUTH_USER_MODEL='App02.User'
三.使用
注册 登录 退出登录 首页验证是否登录 修改密码 路由保护
3.0 路由
# urls.py
app_name="App02"
urlpatterns = [
path('',views.index,name="index"), # 首页
path('userregister/',views.user_register,name="userregister"), # 注册
path('login/',views.user_login,name="login"), # 登录
path('logout/',views.user_logout,name="logout"), # 退出登录
# 修改密码
path('change/', views.change, name="change"),
# 路由保护
path('publish/',views.publish,name="publish"),
path('test/',views.test_pass,name="test"), # 密码加密
]
3.1 注册
# 注册: 密码会做签名加密 : user=User.objects.create_user(**data)
def user_register(request):
if request.method == "POST":
form = RegisterForm(request.POST) # 调用验证form
if form.is_valid():
data = form.cleaned_data
data.pop("confirm")
print(data, type(data))
# 把用户写入数据库
# 密码会做签名加密,不能手动签名加密password
user = User.objects.create_user(**data)
if user:
return HttpResponse("注册成功")
else:
return render(request, "register.html", {"form": form})
else:
return render(request, "register.html", {"form": form})
# get请求
return render(request, "register.html")
3.2 登录
# 登录: login(request, user)
@csrf_exempt
def user_login(request):
if request.method == 'POST':
user = request.POST.get("username", '')
pwd = request.POST.get("password", '')
# 用户验证,如果用户名和密码正确,返回User的对象,否则返回None
user = authenticate(request, username=user, password=pwd)
if user:
# 记录用户登录状态,参数是请求对象和用户对象
login(request, user)
return redirect(reverse('App02:index'))
else:
return render(request, 'login.html', {"msg": "用户名或密码错误"})
return render(request, 'login.html')
<body>
<h2>{{ msg }}</h2>
<form action="{% url 'App02:login' %}" method="post">
{% csrf_token %}
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
3.3 退出登录
# 退出登录: logout(request)
def user_logout(request):
# 退出登录
logout(request)
return redirect(reverse('App02:index'))
3.4 首页
# 首页: is_authenticated:判断是否登录
def index(request):
# is_authenticated: 在后端判断是否登录,登录为True,不登录为False
print(request.user.is_authenticated)
return render(request, "index.html")
<body>
{% if request.user.is_authenticated %}
{{ request.user.username }} <a href="{% url 'App02:logout' %}">退出登录</a>
{% else %}
你还没登录,请先登录<a href="{% url 'App02:login' %}">登录</a>
{% endif %}
</body>
3.5 修改密码
# 修改密码: user.set_password("123")
def change(request):
# 修改密码
user = User.objects.get(pk=1)
user.set_password("123")
user.save()
return HttpResponse("修改密码"
3.6 路由保护
# 路由保护 : login_url:没登录跳转
@login_required(login_url="/login/")
def publish(request):
return HttpResponse("发表文章")
# 或者不在 @ login_required() 中配置未登录跳转页面,在settings.py中配置
# 登录页面地址
LOGIN_URL = "/login/"
3.7密码加密
# 1. settings.py配置
# 密码配置
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.Argon2PasswordHasher',
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]
# 2. 视图函数加密
def test_pass(request):
password = make_password("123") # 对密码加密
print(password)
print(check_password("123", password)) # 验证密码,密码正确返回True,否则False
return HttpResponse("ok")