djano笔记(八)认证
1.用户认证
认证需要用到auth模块
使用django自带的User模型
在django shell里先创建用户,
>>> from django.contrib import auth
>>> from django.contrib.auth.models import User
>>> User.objects.create_user(username='user2001',password='123456')
<User: user2001>
验证,验证成功返回user对象
>>> auth.authenticate(username='user2001',password='123456')
<User: user2001>
如果验证失败,返回为None
>>> auth.authenticate(username='user2001',password='1234567')
没有返回
修改密码再次验证,验证成功
>>> user2001=User.objects.filter(username='user2001')[0]
>>> user2001.set_password('1234567')
>>> auth.authenticate(username='user2001',password='1234567')
<User: user2001>
此外还可以使用如下方法
create():创建一个普通用户,密码是明文的。 创建用户貌似登录不了
create_superuser():创建一个超级用户要多传一个邮箱 email 参数。
2.创建user app
python manage.py startapp users
setting文件激活模型
此外setting文件增加,LOGIN_URL = 'users:login',默认为account/login
父路由增加
path('users/', include('users.urls')),
users的子路由添加
path('', include('django.contrib.auth.urls')),
当用户请求、user/login.则会自动跳转到默认的登录视图
我们需要提供个登录的模板文件
路径在users\templates\registration\login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% extends "myapp/base.html" %}
{% block page_header %}
<h2>用户登录</h2>
{% endblock page_header %}
{% block page_content %}
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
<form method="post" action="{% url 'users:login' %}">
{% csrf_token %}
<!--{{ form.as_p }}-->
<div class="mb-3">
<label for="formGroupExampleInput" class="form-label">用户名</label>
<input type="text" class="form-control" id="formGroupExampleInput" name="username" placeholder="Example input placeholder">
</div>
<div class="mb-3">
<label for="formGroupExampleInput2" class="form-label">密码</label>
<input type="password" class="form-control" id="formGroupExampleInput2" name="password" placeholder="Another input placeholder">
</div>
<button name="submit" class="btn btn-primary">Log in</button>
<input type="hidden" name="next" value="{% url 'myapp:index' %}" />
<input type="hidden" name="next" value={{next}} />
</form>
{% endblock page_content %}
</body>
</html>
父模板添加登录连接
<a href="{% url 'users:login' %}">Log in</a>
以及注销连接
<a href="{% url 'users:logout' %}">Log out</a>
不用自己去写登录的视图,系统会自动调用默认的视图函数去认证
也可以自己去重写
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
# A backend authenticated the credential
selse:
# No backend authenticated the credentials
image.png
*自定义登出模板
路径在users\templates\registration\logged_out.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>已经登出,欢迎再回来!</p><a href="{% url 'users:login' %}">再次登录</a>
{% endblock content %}
路由
path('user_logout/',views.user_logout,name='user_logout')
视图
def user_logout(request):
logout(request)
return render(request, 'registration/logged_out.html')
再次运行,发现还是用的默认的登出
image.png而且再次登录会跳转到admin的登录页面
image.png将logged_out.html移动到template下面,修改视图
def user_logout(request):
logout(request)
return render(request, 'logged_out.html')
再次执行
image.png*修改注册用户
3几个内置的form
from django.contrib.auth.forms import UserCreationForm,UserChangeForm
from django.http import HttpResponse
def register(request):
"""Register a new user."""
if request.method != 'POST':
form = UserCreationForm()
else:
form = UserCreationForm(data=request.POST)
if form.is_valid():
new_user = form.save()
login(request, new_user)
return redirect('myapp:index')
# Display a blank or invalid form.
context = {'form': form}
return render(request, 'registration/register.html', context)
def change_user(request):
if request.method != 'POST':
form = UserChangeForm()
else:
form = UserChangeForm(data=request.POST)
if form.is_valid():
form.save()
return HttpResponse("修改成功")
# Display a blank or invalid form.
context = {'form': form}
return render(request, 'changgeuser.html', context)
path('', include('django.contrib.auth.urls')),
path('register/', views.register, name='register'),
path('user_logout/',views.user_logout,name='user_logout'),
path('change_user/',views.change_user,name='change_user')
模板文件
{% extends "myapp/base.html" %}
{% block page_content %}
<form method="post" action="{% url 'users:change_user' %}">
{% csrf_token %}
{{ form.as_p }}
<button name="submit">修改</button>
</form>
{% endblock page_content %}
changgeuser会发现很多字段,很多字段都是非必要的,可以自己写form,然后取自己需要的字段就可以
image.png除此之外,user模型还有一些其他的默认视图,比如重置密码,修改密码,等等,都是一些CBV,基于类的视图,在路由里指定对应模式后就可以使用
image.png