上節初步實現了登錄和注冊模塊,這節我們進一步實現“記住我”功能。
大體功能分為以下模塊:
1.在登錄時如果勾選記住我,那么就將用戶username存進cookie中,跳轉到index頁面;
2.此時,如果不進行登出,如果直接返回登錄頁面,那么就會判斷cookie中是否存在username,如果存在,就直接跳轉到Index界面,也就是不用再一次登錄;
3.如果進行登出,則刪除cookie中的username,並返回登錄界面;
4.如果登錄時不勾選記住我,那么跳轉到index界面后,在訪問登錄界面不會繼續跳轉到Index界面;
5.若直接訪問Index界面,會判斷cookie中是否存在username,如果不存在,則會提示對不起,請先登錄,三秒之后跳轉到登錄界面。
urls.py
from django.urls import path from . import views app_name='login' urlpatterns=[ path('',views.login,name='login'), path('register/',views.register,name='register'), path('register/savereg/',views.save_register,name='savereg'), path('tologin/',views.to_login,name='tologin'), path('logout/',views.logout,name='logout'), path('index/',views.index,name='index'), ]
views.py

from django.shortcuts import render, redirect from .models import Users import datetime # Create your views here. def login(request): if request.get_signed_cookie('username', salt='SSS', default=None) != None: username = request.get_signed_cookie('username', salt='SSS', default=None) return render(request, 'login/index.html', {'username': username}) return render(request,'login/login.html') def register(request): return render(request,'login/register.html') def save_register(request): if request.method == 'POST': phone=request.POST.get('phone') username=request.POST.get('username') password=request.POST.get('password') repassword=request.POST.get('repassword') birthday=request.POST.get('birthday') errormsg='' if phone =='': errormsg='手機號不能為空' elif password =='': errormsg='密碼不能為空' else: if password!=repassword: errormsg='確認密碼與密碼不一致' if errormsg == '': Users.objects.create(phone=phone,username=username,password=password,birthday=birthday, regday=datetime.datetime.now().strftime('%Y-%m-%d')) return render(request,'login/pagejump.html') else: return render(request,'login/register.html',context={'errormsg':errormsg}) def to_login(request): if request.method == 'POST': phone=request.POST.get('phone') remember=request.POST.get('remember') if phone == '': return render(request, 'login/login.html', {'errormsg': '用戶名不能為空'}) try: user_obj = Users.objects.get(phone=phone) except Users.DoesNotExist: return render(request,'login/login.html',{'errormsg':'賬號不存在,請重新輸入'}) pwd=user_obj.password password = request.POST.get('password') if password != '': repwd=password if pwd == repwd: username=user_obj.username if remember is not None: response = render(request, 'login/index.html',{'username':username}) response.set_signed_cookie("username", username, salt="SSS", max_age=60 * 60 * 12) return response else: return render(request, 'login/index.html', {'username': username}) # return render(request, 'login/index.html',{'username':username}) else: return render(request, 'login/login.html',{'errormsg':'密碼錯誤'}) else: return render(request, 'login/login.html', {'errormsg': '密碼不能為空'}) def check_login(func): def helper(request,*args,**kwargs): if request.get_signed_cookie('username',salt='SSS',default=None) != None: return func(request,*args,**kwargs) else: return render(request,'login/checklogin.html') return helper def logout(request): response = redirect("/login/") response.delete_cookie("username") return response @check_login def index(request): return render(request,'login/index.html')
index.html

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h3><p>hello {{username}}</p></h3><span><p><a href="{% url 'login:logout'%}">登出</a></p></span> </body> </html>
login.html

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>盒老師</title> <meta name="keywords" content="盒老師"> <meta name="content" content="盒老師"> <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1"> <link type="text/css" rel="stylesheet" href="/static/login/css/login.css"> <script type="text/javascript" src="/static/login/js/jquery.min.js"></script> </head> <body class="login_bj" > <div class="zhuce_body" style="position:absolute;left:130px;top:300px;"> <div class="zhuce_kong login_kuang" > <div class="zc"> <div class="bj_bai" style="height:330px;"> <h3>登錄</h3> <form action="{% url 'login:tologin'%}" method="post"> <p style="color: red;margin-top: 0px;">{{errormsg}}</p> <input name="phone" type="text" class="kuang_txt" placeholder="手機號"> <input name="password" type="text" class="kuang_txt" placeholder="密碼"> <div> <input name="remember" type="checkbox" value="remember" ><span>記住我</span><a href="#" style="float:rigth;">忘記密碼</a> </div> <div> <p>沒有賬號?<a href="{% url 'login:register'%}">立即注冊</a></p> </div> <input style="margin-top:2px;" name="登錄" type="submit" class="btn_zhuce" value="登錄"> </form> </div> </div> </div> </div> </body> </html>
checklogin.html

<body> <div align="center" style="border: 1px solid blueviolet; position:absolute;left:500px;top: 200px;width: 430px;height: 50px;"> <p style="text-align: center;font-size: 20px;">對不起!請先登錄!還有<span id="sp">3</span>秒跳轉到登錄界面...</p> </div> <script> //onload事件會在頁面加載完后立即發生 onload=function () { //etInterval() 方法可按照指定的周期(以毫秒計)來調用函數或計算表達式。 setInterval(go,1000) }; var x=2; function go() { if (x>=0){ document.getElementById("sp").innerText=x; }else { location.href="{% url 'login:login'%}"; } x--; } </script> </body>
到這里,登錄注冊也基本告一段落了。同時我的django之旅也暫時告一段落了,花了接近一個月的時間,也算是有所收獲,找時間會將所有代碼上傳至github。接下來准備去看自然語言處理了,極大可能是自己以后工作的內容。