20Django云笔记项目3(用户登录)
一,准备工作:
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')
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 resp

浙公网安备 33010602011771号