网站建设需要哪个部门审批,软件技术主要学什么课程,WordPress字库压缩,虚拟邮箱注册网站一、FBV 用户登录验证
1.1 登录验证并加入 session
用户登录时#xff0c;使用 authenticate 验证用户名和密码是否正确#xff0c;正确则返回一个用户对象。 用户名默认的字段名是 username 密码默认的字段名是 password
将已验证的用户添加到当前会话(session)中#x…一、FBV 用户登录验证
1.1 登录验证并加入 session
用户登录时使用 authenticate 验证用户名和密码是否正确正确则返回一个用户对象。 用户名默认的字段名是 username 密码默认的字段名是 password
将已验证的用户添加到当前会话(session)中可使用 login() 函数完成。
from django.contrib.auth import authenticate, logindef my_view(request):username request.POST[username]password request.POST[password]user authenticate(request, usernameusername, passwordpassword)if user is not None:login(request, user)# Redirect to a success page....else:# Return an invalid login error message....1.2 登出
from django.contrib.auth import logoutdef logout_view(request):logout(request)# Redirect to a success page.注意如果用户未登录logout() 不会报错。
调用 logout() 后当前请求的会话数据会被全部清除
1.3 限制对未登录用户的访问 限制访问页面最简单的办法就是检查 request.user.is_authenticated 并重定向到登录页面。 这个校验的属性同样使用模板语言中 {% if request.user.is_authenticated %} 登录成功 {% endif %} login_required 装饰器实现
from django.contrib.auth.decorators import login_requiredlogin_required
def my_view(request):...二、 CBV 用户登录验证
这里假设用户的 model 是 UsersProfile 是继承于 AbstractUser
2.1 登录验证
2.1.1 默认的验证类
Django 的 LoginView 用于对用户登录时提供的用户名和密码进行校验.
注意 LoginView 也是只验证用户名和密码并且要求存入数据库的密码字段的值必须是密文的。
django.contrib.auth.hashers 中的 make_password 可以对明文加密。
from django.contrib.auth.hashers import make_password
make_password(明文密码)① 设置 settings 首先需要在 settings.py 中设置如下内容
from django.urls import reverse_lazy
# 用户登录成功后跳转的 URL
LOGIN_REDIRECT_URL reverse_lazy(users:users)# 用户登录 GET 请求的 URL和登录验证失败后跳转到的 URL
LOGIN_URL reverse_lazy(users:login)② 视图 在 views.py 中编写如下 CBV
from django.contrib.auth.views import LoginViewclass UserLoginView(LoginView):# 指定一个用于接收到 GET 请求时需要返回的模板文件template_name login.html三、 自定义验证类
假如希望在用户登录的时候可以支持多种方式比如 邮箱手机号等。 那就需要对这些字段进行校验默认的验证类 LoginView 是无法实现的此时就需要自定义一个验证类。
3.1 登录验证
① 编写自定义验证类
可以在项目 app 的任意一个文件中编写这个类之后设置一下就可以了。
比如在 users 应用下新建一个文件 users_auth.py, 添加如下内容
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.db.models import QUser get_user_model()class CustomBackend(ModelBackend):def authenticate(self, request, usernameNone, passwordNone, **kwargs):try:# 通过用户名或邮箱来获取用户对象user User.objects.get(Q(usernameusername) |Q(emailusername ) |Q(mobile username))# 验证用户的密码if user.check_password(password):return userexcept Exception:return None② 在 settings.py 中设置
# 自定义登录验证类
AUTHENTICATION_BACKENDS (users.users_auth.CustomBackend, # 注意后面的逗号
)3.2 限制对未登录用户的访问
用基于类的视图时可以使用 LoginRequiredMixin 实现和 login_required 相同的行为。这个 Mixin 应该在继承列表中最左侧的位置。
from django.contrib.auth.mixins import LoginRequiredMixinclass MyView(LoginRequiredMixin, View):login_url /login/示例
from django.urls import reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixinclass AssetListView(LoginRequiredMixin, ListView):# 假如没有登录页面将会跳转到下面设置的路由login_url reverse_lazy(users:login)...3.3 退出登录
退出时候用户的所以未保存的信息将会丢失比如正则编写的一个页面中的内容。 同时用户信息和登录状态将会删除。
from django.contrib.auth.views import LogoutViewclass UserLogoutView(LogoutView):# 用户退出登录后将要跳转的 URLnext_page reverse_lazy(users:login)