1. 程式人生 > 其它 >Django框架下的Session操作

Django框架下的Session操作

1、首先編寫login.html登入頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登入頁面</title>
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
    <script type="text/javascript" src="/static/js/jquery-3.4.1.js"></script>
    <script type="text/javascript" src="/static/login/login.js"></script>
    <style>
        #login-btn{
            outline: none;
            border: none;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-3 col-lg-offset-3">
            <div>
                <form>
                    {% csrf_token %}
                    <div class="form-group">
                        使用者名稱<input type="text" id="user" class="form-control">
                    </div>
                    <div class="form-group">
                        密碼<input type="password" id="pwd" class="form-control">
                    </div>
                    <input type="button" value="登入" id="login-btn" class="btn btn-success pull-right">
                    <p class="error"></p>
                </form>
            </div>
        </div>
    </div>
</div>
</body>
</html>

2、編寫登入後跳轉index.html頁面,跳轉頁面上面有session登出使用者登入按鈕

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>
<h3>上次登入時間:{{ last_visit_time }}</h3>
<h2>Hi! {{ username }}</h2>
<a href="/login_out/">登出</a>
</body>
</html>

3、利用jquery, ajax編寫使用者驗證登入,

$(function () {
    $('#login-btn').click(function () {
        $.ajax({
            url: '',
            type: 'post',
            data:{
                user: $('#user').val(),
                pwd: $('#pwd').val(),
                // 因利用ajax驗證使用者登入需要新增如下:
                csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val()
            },

            success:function (data) {
                if (data.user){
                    location.href='/index/'
                }else{
                    $('.error').text(data.msg).css({
                        color: 'red',
                    })
                }
            }
        })
    });
});

4、Django框架session操作,驗證使用者登入

def login(request):
    import datetime
    """
    設定session
    request.session['is_login'] = True        #設定session為True判斷為登入成功
    request.session['username'] = status.user #設定session獲取使用者名稱
    步驟:
        1 生成一個隨機字串: "fkg8qxjby49c25jx9s1h4g7tgfvrhbgq"
        2 response.set_cookie(sessionid	, fkg8qxjby49c25jx9s1h4g7tgfvrhbgq)
        3 在diango-session 表中建立一條記錄
            session_key                               session_data                            expire_date
            fkg8qxjby49c25jx9s1h4g7tgfvrhbgq     OTJiYWMyNzQwMTkwZWQ3YWQzMDQ2YmY......          時間日期
        4 不同的賬戶在相同遊覽器第一次登入django-session表裡面會新增一條記錄,如果相同的遊覽器不同的賬戶登入過,django-session表
        session_key對應的key資料不會變,session_daa,expire_date資料會更新,
    
    """

    if request.method == "POST":
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        status = UserInfo.objects.filter(user=user, pwd=pwd).first()
        msg = {"user": None, 'msg': None}
        if status:
            msg['user'] = status.user
            # 設定session
            request.session['is_login'] = True
            request.session['username'] = status.user
            # 設定登入時間
            now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            request.session['last_visit_time'] = now_time
        else:
            msg['msg'] = '賬戶或密碼輸入錯誤'
        return JsonResponse(msg)

    return render(request, 'login/login.html')


def login_out(request):
    """
    del request.session['is_login'] 只會刪除is_login一個鍵值,djiango_session表對應的session_data
    列儲存的對應的資料,不推薦使用這個方法進行登出操作
    request.session.flush():刪除當前會話資料並刪除會話Cookie。這用於確保前面的會話資料不可以再次被使用者遊覽訪問
    flush()對應操作:
        1 首先獲取   sessionid = request.COOKIE.get('sessionid')
        2 進行查詢刪除django-session.objects.filter(session-key=sessionid).delete()
        3 進行cookie刪除 response.delete_cookie('sessionid', sessionid)
    :param request:
    :return:
    """
    # del登出刪除方法不推薦使用
    # del request.session['is_login']

    # 推薦使用flush方法
    request.session.flush()
    return redirect('/login/')


def index(request):
    """
    獲取djanog_session表資料request.session.get('is_login') is_login:是設定session時key主鍵
    :param request:
    :return:
    """
    is_login = request.session.get('is_login')
    # is_login獲取為True代表登入成功,可以訪問設定的session頁面,否則跳轉到登入頁面登入後才能訪問
    if is_login:
        # 獲取session設定使用者名稱
        username = request.session.get('username')
        # 獲取session設定登入時間
        last_visit_time = request.session.get('last_visit_time')
        return render(request, "login/index.html", locals())
    else:
        return redirect('/login/')

5、Django預設支援Session,並且預設是將Session資料儲存在資料庫django_session表中。session相關引數,需要在settings.py檔案裡面設定

SESSION_COOKIE_NAME = "sessionid"               # Session的cookie儲存在遊覽器上的key,及sessionid="隨機字串"(預設)
SESSION_COOKIE_PATH = "/"                       # Session的cookie儲存的路徑(預設)
SESSION_COOKIE_DOMAIN = None                    # Session的cookie儲存的域名(預設)
SESSION_COOKIE_SECURE = False                   # 是否https傳輸cookie(預設)
SESSION_COOKIE_HTTPONLY = True                  # 是否Session的cookie只支援http傳輸(預設)
SESSION_COOKIE_AGE = 1209600                    # Session的cookie失效日期2周(預設)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False         # 是否關閉遊覽器使得Session過期(預設)
SESSION_SAVE_EVERY_REQUEST = False              # 是否每次請求都儲存Session,預設修改之後儲存(預設)