一,准备工作:

1把html页面放到指定位置:templates/user/login.html

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<title>login</title>

</head>

<body>
<div id="loginDiv">
<form action="/user/login" id="form" method="post">
<h1 style="text-align: center;color: aliceblue;">登录</h1>
<p>用户名:<input id="userNname" name="userNname" type="text"></p>

<p>密码: <input id="password" name="password" type="password"></p>
<p><input type="checkbox" name="remember">:记住用户名</p>

<div style="text-align: center;margin-top: 30px;">
<input type="submit" class="button" value="登录">
</div>
</form>
</div>

</body>
</html>

2配置路由:

path('login',views.login_view),

3编写视图函数:

def login_view(request):
return render(request,'user/login.html')

4浏览​​http://127.0.0.1:8000/user/login​


 

二先跑通基本登录:

def login_view(request):
if request.method == 'GET':
return render(request,'user/login.html')
elif request.method == 'POST':
#先查用户是不是存在
username = request.POST.get('userNname')
password = request.POST.get('password')
try:
user = User.objects.get(username=username)
except Exception as e:
print('--login user error %s'%(e))
return HttpResponse('用户名或密码错误')
#用户存在再比对密码
m = hashlib.md5()
m.update(password.encode())
if m.hexdigest() != user.password:
return HttpResponse('用户名或密码错误')
#如果密码比对成功,那么就记录会话状态
request.session['username'] = username
request.session['uid'] = user.id
return HttpResponse('--登录成功--')

三完成记住用户逻辑:

1)勾选上checkbox复选框后,浏览器会默认会传过来一个remember=on,因此我们可以根据本次请求中有没有remember这个key来判断用户有没有勾选记住用户:

#判断用户是否勾选了记住用户名复选框,如果选了,我们就让cookies存储uid和username,时间为3天
if 'remember' in request.POST:
resp.set_cookie('username', username, 3600*24*3)
resp.set_cookie('uid',user.id,3600*24*3)

2)既然已经用上session和cookies了,那么逻辑上我们也要完善:

如果session存在就登录,如果session不存在我们就检查cookie是否存在,如果cookies存在就回写session并登录否则就给客户展示登陆页面

if request.method == 'GET':
#检查登录状态
if request.session.get('username') and request.session.get('uid'):
return HttpResponse('已登陆')
#如果session没进去就检查cookies
c_uname = request.COOKIES.get('uname')
c_uid = request.COOKIES.get('uid')
if c_uname and c_uid:
#回写session
request.session['username'] = c_uname
request.session['uid'] = c_uid
return HttpResponse('已登录')
return render(request,'user/login.html')

3)最终完善的登录视图逻辑如下:

def login_view(request):
if request.method == 'GET':
#检查登录状态
if request.session.get('username') and request.session.get('uid'):
return HttpResponse('已登陆')
#如果session没进去就检查cookies
c_uname = request.COOKIES.get('uname')
c_uid = request.COOKIES.get('uid')
if c_uname and c_uid:
#回写session
request.session['username'] = c_uname
request.session['uid'] = c_uid
return HttpResponse('已登录')
return render(request,'user/login.html')
elif request.method == 'POST':
#先查用户是不是存在
username = request.POST.get('userNname')
password = request.POST.get('password')
try:
user = User.objects.get(username=username)
except Exception as e:
print('--login user error %s'%(e))
return HttpResponse('用户名或密码错误')
#用户存在再比对密码
m = hashlib.md5()
m.update(password.encode())
if m.hexdigest() != user.password:
return HttpResponse('用户名或密码错误')
#如果密码比对成功,那么就记录会话状态
request.session['username'] = username
request.session['uid'] = user.id
resp = HttpResponse('--登录成功--')
#判断用户是否勾选了记住用户名复选框,如果选了,我们就让cookies存储uid和username,时间为3天
if 'remember' in request.POST:
resp.set_cookie('username', username, 3600*24*3)
resp.set_cookie('uid',user.id,3600*24*3)
return