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

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 resp

 

posted @ 2021-12-03 13:29  linuxTang  阅读(68)  评论(0)    收藏  举报