Python-Django:状态保持(cookie and session)及实例代码

状态保持

http协议是无状态的,即下一次去访问一个页面时并不知道上一次这个页面做了什么。

在web中记录信息的两种方式:cookiesession

·

Cookie

是以服务器生成,存储在浏览器端的一小段文本信息

特点:

1)以键值对方式进行存储。

2)通过浏览器访问一个网站时,会将浏览器存储的跟网站相关的所有cookie信息发送给该网站的服务器。 request.COOKIES

3)cookie 是基于域名安全的。

4) cookie 是有过期时间的,如果不指定,默认关闭浏览器后 cookie 就会过期。

在这里插入图片描述

代码实例:

views.py

from django.http import HttpResponse


def set_cookie(request):
	'''设置cookie信息'''

	# 创建一个HttpResponse对象
	response = HttpResponse('设置cookie')
	# 设置一条cookie信息,设定过期时间为14天后
	response.set_cookie('num', 1, max_age=14*24*3600)
	return response

在这里插入图片描述

`

views.py

from django.http import HttpResponse

def get_cookie(resquest):
	'''获得cookie值'''
	
	# request属性COOKIES字典中保存了所有的cookie键值对,通过COOKIES取出对应的值
	num = request.COOKIES['num']
	return HttpResponse(num)

在这里插入图片描述

·

·

登录案例–通过cookie记住用户名和密码

views.py

def login_ajax(request):
    if 'username' in request.COOKIES:
        username = request.COOKIES['username']
    else:
        username = ''
    if 'password' in request:
        password = request.COOKIES['password']
    else:
        password = ''

    return render(request, 'booktest/login_ajax.html', {'username': username, 'password': password})


def login_ajax_check(request):
    # 获取用户名和密码
    username = request.POST.get('username')
    password = request.POST.get('password')

    # 获取是否记住用户名和密码的选项勾选状态,为None表示没有勾选,为on表示勾选
    remember = request.POST.get('remember')

    # 进行效验,返回json数据
    try:
        # 从数据库中获取姓名为username的对象
        u1 = UserInfo.objects.get(username=username)
    except:
        return JsonResponse({'res': 0})

    else:
        if u1.password == int(password):
            response = JsonResponse({'res': 1})
            # 当数据库中存在该用户名和密码时设置cookie值,设置过期时间为一周
            response.set_cookie('username', username, max_age=7*24*3600)
            response.set_cookie('password', password, max_age=7*24*3600)
            return response
        else:
            return JsonResponse({'res': 2})

·

login_ajax.html

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <title>ajax登陆页面</title>
    <script src="/static/js/jquery-1.12.4.min.js"></script>
    <script>
        $(function(){
            $('#btnLogin').click(function () {
                // 获取用户名和密码
                nameuser = $('#nameuser').val()
                passqord = $('#password').val()

                // 发起post ajax 请求
                $.ajax({
                    'url':'login_ajax_check',
                    'type':'post',
                    'data':{'username':nameuser, 'password':passqord},
                    'datatype':'json'
                }).success(function (data) {
                    // 登录成功{'res':1}
                    // 登录失败{'res':0}

                    if (data.res === 0){
                        $('#errmsg').show().html('用户名输入错误')

                    }
                    else if(data.res === 2){

                        $('#errmsg').show().html('密码输入错误')
                    }
                    else {
                        // 跳转到图书界面
                        location.href = '/books'
                    }
                })
            })
        })
    </script>
    <style>
        #errmsg{
            display: none;
            color: red;
        }
    </style>
</head>
<body>
<div>
    用户名:<input type="text" id="nameuser" value="{{ username }}"><br/>
    密码:<input type="password" id="password" value="{{ password }}"><br/>
    <input type="checkbox" name="remember">记住用户名<br/>
    <input type="button" id="btnLogin" value="登录">
    <div id="errmsg"></div>
</div>
</body>
</html>

实验结果:

在这里插入图片描述
·

·

在这里插入图片描述

·

·

·

session

session存储在服务器端

特点:

1)session 是以键值对进行存储的

2)session 依赖于 cookie。唯一的 标识码保存在 sessionid cookie

3)session 也有过期时间,如果不指定,默认两周就会过期

设置session:request.session[‘username’] = ‘xxx’
获取session:request.session[‘username’]

在这里插入图片描述
·

通过HttpRequest对象的session属性进行读写操作

1)以键值对的格式写入session

request.session[‘键’] = 值

2)根据键读取值

request.session.get(‘键’, 默认值)

3)清除所有session,在存储中(数据库中django自建的session表)删除值部分,键(唯一标识码)保留

request.session.clear()

4)清楚session数据,在存储中删除session的整条数据

request.session.flush()

5)删除session中的指定键的值,在存储中只删除某个键对应的值,键保留

del request.session[‘键’]

6)设置会话的超过时间,如果没有指定过期时间则两个星期后过期

request.session.set_expiry(value)

● 如果value是一个整数,会话的session_id cookie将在value秒没有活动后过期。
● 如果value为0,那么用户会话的session_id cookie将在用户的浏览器关闭时过期。
● 如果value为None,那么会话的session_id cookie两周之后过期。

·

代码实例

views.py

from django.http import HttpResponse

def set_session(request):
	request.session['name'] = 'name'
	request.session['age'] = 18
	return HttpResponse('设置session')
	

在这里插入图片描述

`

from django.http import HttpResponse

def get_session(request):
	name = request.session['name']
	age = request.session['age']
	return HttpResponse(name+':'+str(age))
	

在这里插入图片描述

`

`

登录案例–记住用户登录状态,下次访问直接登录跳转不必输入用户和密码

代码实例:

views.py

def login_ajax(request):
    # 当服务器session表中含有键isLogin时,直接转到图书界面
    if request.session.has_key('isLogin'):
        return render(request, 'booktest/books_display.html')
    else:
        if 'username' in request.COOKIES:
            username = request.COOKIES['username']
        else:
            username = ''
        if 'password' in request:
            password = request.COOKIES['password']
        else:
            password = ''

        return render(request, 'booktest/login_ajax.html', {'username': username, 'password': password})


def login_ajax_check(request):
    # 获取用户名和密码
    username = request.POST.get('username')
    password = request.POST.get('password')

    # 获取是否记住用户名和密码的选项勾选状态,为None表示没有勾选,为on表示勾选
    remember = request.POST.get('remember')

    # 进行效验,返回json数据
    try:
        # 从数据库中获取姓名为username的对象
        u1 = UserInfo.objects.get(username=username)
    except:
        return JsonResponse({'res': 0})

    else:
        if u1.password == int(password):
            response = JsonResponse({'res': 1})
            # 当数据库中存在该用户名和密码时设置cookie值,设置过期时间为一周
            response.set_cookie('username', username, max_age=7 * 24 * 3600)
            response.set_cookie('password', password, max_age=7 * 24 * 3600)

            # 利用session,设置用户已登录
            request.session['isLogin'] = True
            return response
        else:
            return JsonResponse({'res': 2})

login_ajax.html

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <title>ajax登陆页面</title>
    <script src="/static/js/jquery-1.12.4.min.js"></script>
    <script>
        $(function(){
            $('#btnLogin').click(function () {
                // 获取用户名和密码
                nameuser = $('#nameuser').val()
                passqord = $('#password').val()

                // 发起post ajax 请求
                $.ajax({
                    'url':'login_ajax_check',
                    'type':'post',
                    'data':{'username':nameuser, 'password':passqord},
                    'datatype':'json'
                }).success(function (data) {
                    // 登录成功{'res':1}
                    // 登录失败{'res':0}

                    if (data.res === 0){
                        $('#errmsg').show().html('用户名输入错误')

                    }
                    else if(data.res === 2){

                        $('#errmsg').show().html('密码输入错误')
                    }
                    else {
                        // 跳转到图书界面
                        location.href = '/books'
                    }
                })
            })
        })
    </script>
    <style>
        #errmsg{
            display: none;
            color: red;
        }
    </style>
</head>
<body>
<div>
    用户名:<input type="text" id="nameuser" value="{{ username }}"><br/>
    密码:<input type="password" id="password" value="{{ password }}"><br/>
    <input type="checkbox" name="remember">记住用户名<br/>
    <input type="button" id="btnLogin" value="登录">
    <div id="errmsg"></div>
</div>
</body>
</html>

在这里插入图片描述

·

·

cookie和session的区别和应用场景

cookie记住用户名。 安全性要求不高。

session涉及到安全性要求比较高的数据。银行卡账户,密码,登陆状态等。

·

cookie保存在客户端
session保存在服务器端

·

cookie的值会直接显示出来
session的值会经过base64编码后保存

·

cookie在Django框架中通过HttpResponse的对象进行设置,获取
session在Django框架中通过request对象进行设置,获取
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此时一位小白路过

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值