zoukankan      html  css  js  c++  java
  • 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')
  • 相关阅读:
    Android中从一个Activity跳转到另一个Activity所经历的生命周期
    Android五种数据存储方式
    Android的Activity启动方式(模式)
    个人笔记--activity--basic
    activity的生命周期
    gradle和maven的区别
    node是什么
    npm是什么
    激光雷达与毫米波雷达区别讲解
    VSLAM技术框架详述
  • 原文地址:https://www.cnblogs.com/hexiaorui123/p/10584740.html
Copyright © 2011-2022 走看看