Django-cookie组件

1 会话跟踪技术

在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束。 在一个会话的多个请求中共享数据,这就是会话跟踪技术。例如在一个会话中的请求如下:  请求银行主页;

  • 请求登录(请求参数是用户名和密码);
  • 请求转账(请求参数与转账相关的数据);
  • 请求信誉卡还款(请求参数与还款相关的数据)。
    在这上会话中当前用户信息必须在这个会话中共享的,因为登录的是张三,那么在转账和还款时一定是相对张三的转账和还款!这就说明我们必须在一个会话过程中有共享数据的能力。

2 会话路径技术使用Cookie或session完成
我们知道HTTP协议是无状态协议,也就是说每个请求都是独立的!无法记录前一次请求的状态。但HTTP协议中可以使用Cookie来完成会话跟踪!在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术。

 

cookie

定义:具体一个浏览器针对一个服务器有值(key-value)

设置cookie

views.py

from django.shortcuts import render, HttpResponse, redirect

# Create your views here.


from app01.models import UserInfo


def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')

        user = UserInfo.objects.filter(user=user, pwd=pwd).first()

        if user:
            '''
            响应体:
                return HttpResponse()
                return render()
                return redirect() 
            
            响应体都可以设置cookie
            '''

            response = HttpResponse('登陆成功')
            response.set_cookie('is_login', True)
            response.set_cookie('username', user.user) # 后面登陆的会把前面的覆盖

            return response

    return render(request, 'login.html')


def index(request):
    print(request.COOKIES)  # {'csrftoken': '略', 'is_login': 'True'}

    is_login = request.COOKIES.get('is_login')

    if is_login:
        username = request.COOKIES.get('username')
        return render(request, 'index.html', locals())
    else:
        return redirect('/login')

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>

<h3>Hi, {{ username }}</h3>
</body>
</html>

cookie参数

'''
class HttpResponseBase:

        def set_cookie(self, key,                 键
                     value='',            值
                     max_age=None,        超长时间 
                              cookie需要延续的时间(以秒为单位)
                              如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止。

                     expires=None,        超长时间
                                 expires默认None ,cookie失效的实际日期/时间。 
                                

                     path='/',           Cookie生效的路径,
                                                 浏览器只会把cookie回传给带有该路径的页面,这样可以避免将
                                                 cookie传给站点中的其他的应用。
                                                 / 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
                     
                             domain=None,         Cookie生效的域名
                                                
                                                  你可用这个参数来构造一个跨站cookie。
                                                  如, domain=".example.com"
                                                  所构造的cookie对下面这些站点都是可读的:
                                                  www.example.com 、 www2.example.com 
                                 和an.other.sub.domain.example.com 。
                                                  如果该参数设置为 None ,cookie只能由设置它的站点读取。

                     secure=False,        如果设置为 True ,浏览器将通过HTTPS来回传cookie。
                     httponly=False       只能http协议传输,无法被JavaScript获取
                                                 (不是绝对,底层抓包可以获取到也可以被覆盖)
                  ): pass

'''

实操

def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')

        user = UserInfo.objects.filter(user=user, pwd=pwd).first()

        if user:
            '''
            响应体:
                return HttpResponse()
                return render()
                return redirect() 
            
            响应体都可以设置cookie
            '''

            response = HttpResponse('登陆成功')
            response.set_cookie('is_login', True, max_age=15)
            # import datetime
            # data = datetime.datetime(year=2019, month=2, day=1, hour=9, minute=28, second=30)  # GMT时间,固定在哪一个时刻失效
            # response.set_cookie('username', user.user, expires=data)  # 后面登陆的会把前面的覆盖

            response.set_cookie('username', user.user, path='/index/')  # 只有index下的视图函数可以获得这个cookie

            return response

    return render(request, 'login.html')

cookie应用之保存上次访问时间

def index(request):
    print(request.COOKIES)  # {'csrftoken': '略', 'is_login': 'True'}

    is_login = request.COOKIES.get('is_login')

    if is_login:
        username = request.COOKIES.get('username')
        
        # 保存上次访问时间
        import datetime
        now = datetime.datetime.now().strftime('%Y-%m-%d %X')

        last_time = request.COOKIES.get('last_visit_time','') # 记录的上次访问index的时间,如果记录login的就写到login里面
        response = render(request, 'index.html', {'username': username, 'last_time': last_time})
        response.set_cookie('last_visit_time', now)  # 把上次时间保存到cookie
        return response
    else:
        return redirect('/login')

 

posted on 2019-03-23 17:23  赫晓蕊  阅读(88)  评论(0编辑  收藏  举报

导航