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']