六. Django项目之电商购物商城 -- 用户登录

Django项目之电商购物商城 -- 用户登录

需要开发文档和前端资料的可私聊

一. 用户名登录

创建视图

复制代码
# 登录视图
class LoginView(View):
    def get(self , request):
        return render(request , 'login.html' )

    def post(self , request):
        login_forms = LoginForms(request.POST)
        if login_forms.is_valid():
            username = login_forms.cleaned_data.get('username')
            password = login_forms.cleaned_data.get('password')
            remembered = login_forms.cleaned_data.get('remembered')

            # 校验数据
            if not all([username , password]):
                return HttpResponse("缺少必要参数")

            # 查询数据库中是否存在用户数据
            user = authenticate(username=username , password = password)

            if user is None:
                return render(request, 'login.html', {'account_errmsg': '用户名或者密码错误'})

            # 登录成功 , 设置保存用户状态
            login(request, user)


            # 如果用户勾选保存
            if remembered:
                # 用户选择记住登录状态 , 状态默认保存14天
                request.session.set_expiry(None)
            else:
                # 用户状态不保存 , 关闭浏览器 , 数据销毁
                request.session.set_expiry(0)

            # 重定向到首页
            return redirect('index')
        else:
            # 获取form组件的错误信息
            content = {"forms_err_msg" : login_forms.errors}
            return render(request , 'login.html' , content)

创建路由

复制代码
path('login/' , views.LoginView.as_view() , name='login'),

二. 手机号/用户名登录

重写django中的ModelBackend方法

复制代码
from django.contrib.auth.backends import ModelBackend
from users.models import User
import re

def check_user(data):
    # 判断传入的data为用户名还是电话
    data_check = re.match(r'1[3-9]\d{9}',data)

    try:
        if data_check:
            user = User.objects.get(mobile=data)

        else:
            user = User.objects.get(username = data)
    except:
        return None
    else:
        return user




# 重写方法
class UserNameModleBack(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):

        user = check_user(username)

        # 判断密码是否正确
        if user.check_password(password) and user:
            return user

        else:
            return None

在setting中配置重写的方法

复制代码
# 配置自定义认证的方法
AUTHENTICATION_BACKENDS = ['users.utils.UserNameModleBack']
相关推荐
tjc1990100518 小时前
Golang怎么实现分布式定时任务_Golang如何保证集群中定时任务不重复执行【进阶】
jvm·数据库·python
卷心菜狗18 小时前
Python进阶--网络编程入门
python
XLYcmy18 小时前
2026游戏安全技术竞赛-PC客户端安全-初赛 求解起点到终点的最短路径
windows·python·网络安全·dfs·bfs·游戏安全·曼哈顿距离
尘埃落定wf18 小时前
FastAPI 鉴权怎么写?中间件和依赖注入一次说清楚
python·中间件·fastapi
2301_7735536218 小时前
构建 Go CLI 应用的最佳实践:纯 Go 交互式命令行库选型与使用指南
jvm·数据库·python
qq_3729069319 小时前
c#如何添加按钮点击事件_c#添加按钮点击事件的几种常见用法
jvm·数据库·python
2301_8176722619 小时前
JavaScript 中高效定位二维数组间不匹配元素的行列索引
jvm·数据库·python
2401_8314194419 小时前
golang如何实现验证码图片生成_golang验证码图片生成实现实战
jvm·数据库·python
LiAo_1996_Y19 小时前
CSS实现多列等高布局_浮动布局的高级处理技巧
jvm·数据库·python
Jenlybein19 小时前
用 uv 替代 conda,速度飙升(从 0 到 1 开始使用 uv)
后端·python·算法