實戰django(二)--登錄實現記住我


上節初步實現了登錄和注冊模塊,這節我們進一步實現“記住我”功能。

大體功能分為以下模塊:

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

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>
View Code

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>
View Code

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>
View Code

到這里,登錄注冊也基本告一段落了。同時我的django之旅也暫時告一段落了,花了接近一個月的時間,也算是有所收獲,找時間會將所有代碼上傳至github。接下來准備去看自然語言處理了,極大可能是自己以后工作的內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM