zoukankan      html  css  js  c++  java
  • python 终极篇 cookie与session

    (1)cookie与session---------->>>>>>>>>>>>>>>>>>>>.>>>>>
        1,为什么http协议是无状态的就可以直接访问任何页面.
            因为http协议无状态,所以他谁也不认识,只要你给请求,我就返回页面.
            若要解决这个问题,可以设置cookie与session.
        2. cookie
            1. cookie是什么?
                cookie是服务器让浏览器保存在浏览器上一组组键值对
                
            Cookie的原理:
                cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;
                      当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
    
                
            2. 特性:
                1. 是服务器让浏览器设置的。浏览器有权利不设置。
                2. 访问其他页面的时候携带着cookie。
            
            3. 能干什么?
                1. 做登录
                2,限制访问频率
                3.记录浏览习惯
                4.简单的投票
        3,为什么浏览器屏蔽掉cookie之后就不能登录???
            因为你提交的时候,服务器会让浏览器设置一个cookie,但是你不设置,所以就不让你登录.
            
            django中操作cookie
                    1. 设置cookie
                        rep = redirect('/index/')
                        rep.set_cookie(key,value,max_age=1000)
                        rep.set_signed_cookie(key,value,max_age=1000,salt='') 加盐方式
                            
                            参数:
                                •key, 键
                                •value='', 值
                                •max_age=None, 超时时间
                                •expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
                                •path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
                                •domain=None, Cookie生效的域名
                                •secure=False, https传输
                                •httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    
                    2. 获取cookie
                        request.COOKIES['key']   
                        request.COOKIES.get('key')        ——》推荐的取法
                        
                        request.get_signed_cookie('key',salt='')  加盐方式
                        
                            get_signed_cookie方法的参数:
                            •default: 默认值
                            •salt: 加密盐
                            •max_age: 后台控制过期时间
    
                        
                        request.method 
                        request.POST        ——》POST请求提交的数据  {}
                        request.GET            ——》URL上的参数    /?id=11&name=xx
                        request.FILES         ——》上传的文件
                    3. 删除cookie
                        rep.delete_cookie('key')
                获取用request,删除和设置都用response对象操作.
    
        注意:form表单中action=""  什么也别填了,填了有可能出问题,有深坑.
            http://127.0.0.1:8000/login/?retuen=/home/     action="/login/"这样提交的地址其实是/login/,不加的话地址才是/login/?retuen=/home/  
            
        4,cookie的缺点???
            保存在浏览器上不安全;请求的时候发的时候,cookie有长度限制64,如果无限大的话 卡死了就
            
        5,session: 都是request操作的,
            session是保存在服务器上的键值对,依赖于cookie
            
            django中操作session
                    1. 设置session
                        request.session['key'] = value 
                        request.session.setdefault(key,value)            ——》 存在就不设置
                    2. 获取session
                        request.session['key']
                        request.session.get(key,'')
                    3. 删除session
                        request.session.pop(key)        ——》 删除某一个键值对
                        del request.session['key']
                        
                        request.session.delete()        ——》删除所有的session键值对
                        request.session.flush()            ——》删除所有的session键值对.删除了cookie
                    4. 设置超时时间
                        request.session.set_expiry()
                    5. 清除当前过期的session
                        request.session.clear_expired()
                        
                # 获取、设置、删除Session中数据
                    request.session['k1']
                    request.session.get('k1',None)
                    request.session['k1'] = 123
                    request.session.setdefault('k1',123) # 存在则不设置
                    del request.session['k1']
    
    
                    # 所有 键、值、键值对
                    request.session.keys()
                    request.session.values()
                    request.session.items()
                    request.session.iterkeys()
                    request.session.itervalues()
                    request.session.iteritems()
    
                    # 会话session的key
                    request.session.session_key
    
                    # 将所有Session失效日期小于当前日期的数据删除
                    request.session.clear_expired()
    
                    # 检查会话session的key在数据库中是否存在
                    request.session.exists("session_key")
    
                    # 删除当前会话的所有Session数据
                    request.session.delete()
                      
                    # 删除当前的会话数据并删除会话的Cookie。
                    request.session.flush() 
                        这用于确保前面的会话数据不可以再次被用户的浏览器访问
                        例如,django.contrib.auth.logout() 函数中就会调用它。
    
                    # 设置会话Session和Cookie的超时时间
                        request.session.set_expiry(value)
                        * 如果value是个整数,session会在些秒数后失效。
                        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
                        * 如果value是0,用户关闭浏览器session就会失效。
                        * 如果value是None,session会依赖全局session失效策略。
            
        6,流程----->>>>> 浏览器首次访问服务器的时候没有cookie,然后访问服务器,服务器会生成一个session_ID字典,字典的值为浏览器的数据和cookie(一个随机字符串),
                        然后返回session_ID给浏览器,下次浏览器再来的时候携带session_ID访问服务器,可以唯一找到对应的服务器存储的session,并且
                        打开这个字典,并从中取到值做对应校验,检验是否正确能否访问
                        注意:一个session对应一个cookie,并且一个浏览器对应一个session数据
                        
            session存在数据库中,默认存在django_session表中,也可以存在一个文件当中,或者缓存当中,这个取决于你的设置.

    django中的session配置:

    1. 数据库Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    
    2. 缓存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    
    3. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
    
    4. 缓存+数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    5. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
    
    其他公用设置项:
    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,默认修改之后才保存(默认)
    
    Django中Session相关设置
    session配置

    登录校验实例:

    from django.shortcuts import render,redirect,HttpResponse
    
    # Create your views here.
    
    def login(request):
        err_msg = ""
        if request.method == "POST":
            username = request.POST.get("username")
            pwd = request.POST.get("pwd")
            if username == "alex" and pwd == "123":
                print(request.get_full_path())
                path = request.GET.get("retuen","/index/")
                ret = redirect(path)
                # ret.set_cookie("is_login","True")
                request.session["is_login"] = "True"
                return ret
            else:
                err_msg = "用户名或密码错误"
        return render(request,"login.html",{"err_msg":err_msg})
    
    def aaa(fn):
        def inner(request,*args,**kwargs):
            return_path = request.path_info
            # if request.COOKIES.get("is_login","") == "True":
            if request.session.get("is_login","") == "True":
                ret = fn(request,*args,**kwargs)
                return ret
            else:
                return redirect("/login/?retuen={}".format(return_path))
        return inner
    
    @aaa
    def index(request):
        return render(request,"index.html")
    
    @aaa
    def home(request):
        return HttpResponse("这是home页面")
    views文件
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^login/', views.login),
        url(r'^index/', views.index),
        url(r'^home/', views.home),
    ]
    urls文件
    </head>
    <body>
    <form action="" method="post">
        {% csrf_token %}
        <p>用户名:<input type="text" name="username"></p>
        <p>密码:<input type="password" name="pwd"></p>
        <button>提交</button>
        {{ err_msg }}
    </form>
    
    </body>
    </html>
    login.html
  • 相关阅读:
    LeetCode OJ String to Integer (atoi) 字符串转数字
    HDU 1005 Number Sequence(AC代码)
    HDU 1004 Let the Balloon Rise(AC代码)
    HDU 1003 Max Sum(AC代码)
    012 Integer to Roman 整数转换成罗马数字
    011 Container With Most Water 盛最多水的容器
    010 Regular Expression Matching 正则表达式匹配
    007 Reverse Integer 旋转整数
    006 ZigZag Conversion
    005 Longest Palindromic Substring 最长回文子串
  • 原文地址:https://www.cnblogs.com/dalaoban/p/9699431.html
Copyright © 2011-2022 走看看