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,默认修改之后保存(默认)

  

posted @ 2022-03-08 14:36  点点滴滴的努力  阅读(305)  评论(0)    收藏  举报