zoukankan      html  css  js  c++  java
  • cookie 和 session 设置

     

    cookie:

    保存在浏览器上的一组键值对, 是由服务器让浏览器进行设置的

    下次浏览器访问的时候会携带cookie.

    request是客户端请求, response是服务端响应.

    读取客户端的cookie要用request, 写入客户端cookie要用response

    登录成功后,服务器使用response写入cookie到客户端浏览器

     

    为什么会有cookie ?

    因为Http协议是无状态保存,每次请求都是无关联的,没有办法保存状态

    所以使用cookie保存状态.

     

    在django中的操作

    设置: response对象.set_cookie(key,value,max_age超时时间=5秒) 本质就是写响应头

    获取: request.COOKIES[key] 或者 request.COOKIES.get(key) 本质就是请求头

    删除: response.delete_cookie(key) 把key设置为空,超时时间为0

     

    加盐设置: response对象.set_signed_cookie(key,value,max_age=5,salt="xxx")

    获取:request.get_singed_cookie(key,salt="xxx",default="")

     

    session:

    保存在服务器上的一组键值对,依赖于cookie.

    session是服务器端技术,利用这个技术,服务器在运行的时候可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器web资源的时候,可以把各自的数据放在各自的session中,当用户再去访问该服务器中其他web资源的时候,其他web资源从各自的session中取出数据.

     

    为什么要有session?

     

    cookie保存在浏览器本地,不安全, session是存在服务器上的

    cookie有长度限制

    session给cookie一把钥匙, cookie只存钥匙. 通过钥匙,进入session的仓库取东西

     

    django中的操作:

    设置session值:

    request.session[key] = value 例如:request.session["session_name"] = "admin" ***

    request.session.setdefault(key,value)

    获取session值:

    request.session[key] 例如:session_name = request.session["session_name"] ***

    request.session.get(key)

    删除session值:

    del request.session[key] 删除一个session信息

    例如: del request.session["session_name"] ***

    request.session.flush() 删除所有的session信息和cookie (把保存session的箱子删除) ***

    request.session.delete() 删除所有的session信息,不删除cookie

    其他

    request.session.set_expire(value) 设置超时时间

    request.session.clear_expired() 清除过期的 将所有session失效日期小于当前日期的数据删除

     

    session的配置:

    from django.conf import global_settings, settingsfrom django.contrib.sessions.backends import db

    django默认支持session, 并且把session的数据存在数据库中,就是django_session表里

    配置settings.py

     

    SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 Session的cookie失效日期(2周)(默认

    SESSION_COOKIE_NAME="sessionid" 保存在浏览器上的

    SESSION_SAVE_EVERY_REQUEST=False 是否每次请求都保存Session,默认修改之后才保存(默认)

    SESSION_ENGINE= 'django.contrib.sessions.backends.db' 引擎(默认) SESSION 的存储的位置

    SESSION_COOKIE_PATH = "/" Session的cookie保存的路径(默认)


      SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)

    在login_session视图函数中,认证成功之后,执行了什么步骤?

    a. 生成一个随机字符串 sessionid=u1sa9vhqpctcf8tudb6j17rzlbibeykz

    b. django_session表中生成一条记录

    浏览器只有session_key, 而找不到session_data.

    用户的信息都是在session_data里面存的.

    比如:

    session_data原始数据是这样的{"is_login":True,"username":"xiao","login_time":"2018-07-04 11:49:52"}

    存表时,做加密存储

    c. 响应体.set_cookie("sessionid","u1sa9vhqpctcf8tudb6j17rzlbibeykz ")

    解释:

    a. django通过随机算法,计算出一个字符串

    b. request.session,这里存的是一个字典. 在login_session中存了3个键值对. 比如:{"is_login":True,"username":"xiao","login_time":"2018-07-04 12:49:52"}

    存储表的时候:

    session_key对应随机字符串, 它表示一个钥匙, 用来从django_session表中取值

    session_data 它是将字典序列化之后, 加密进行存储. 注意:key的值必须是字符串, 否则无法序列化

    expire_date是在当前基础上,加14天

    c. 响应体, 就是服务器返回给浏览器的. 响应体.set_cookie,表示设置一条cookie

    sessionid这个名字是固定的,对应的是django_session表中的session_key

    一台电脑的一个浏览器,对应django_session表中的唯一一条记录

    在index_session视图函数中,认证成功之后, 是如何渲染的​?

     

    a. 获取随机字符串sessionid u1sa9vhqpctcf8tudb6j17rzlbibeykz

    b. 在服务器的django表中查询session_key=u1sa9vhqpctcf8tudb6j17rzlbibeykz 的记录

    使用ORM查询

    obj= django.session.objects.filter(session_key=..........).first()

    c. 获取session值

    request.session.get("username")

    request.session.get("pwd")

    cookie 和 session 的设置 登录 注销 练习

    from django.shortcuts import render,redirect,HttpResponse
    import datetime
    # Create your views here.
    
    # cooike
    def index(request):
        print(request.COOKIES)
        is_login=request.COOKIES.get("is_login")  #从cookie中获取登录状态
        if not is_login: #判断登录状态是false
            return redirect("/login/") #302从定向到登录页面
    
        username = request.COOKIES.get("username")
        login_time = request.COOKIES.get("login_time") #获取cookie中的登录时间
        return render(request,"index.html",{"username":username,"login_time":login_time})
    
    
    def login(request):
        if request.method == "POST":
            user = request.POST.get("username")
            pwd = request.POST.get("password")
            if user=="xiao" and pwd=="123":
                obj = redirect("/index/") #重定向到登录页面
                obj.set_cookie("is_login",True)#cookie设置登录状态
                obj.set_cookie("username",user)#cookie设置用户名
                #获取当前时间
                now = datetime.datetime.now().strftime("%Y-%m-%d %H:%I:%S")
                obj.set_cookie("login_time",now) #cookie设置登录时间
                return obj
        return render(request,"login.html")
    
    
    
    # session
    def login_session(request):
        if request.method == "POST":
            user = request.POST.get("username")
            pwd = request.POST.get("password")
            if user == "alex" and pwd =="123":
                # 写session
                request.session["is_login"] = True #session设置登录状态
                request.session["username"] = user #session设置用户名
                now = datetime.datetime.now().strftime("%Y-%m-%d %H:%I:%S")
                request.session["login_time"]=now
                return redirect("/index_session/") #302重定向到首页
        return render(request,"login.html")
    
    
    def index_session(request):
        is_login = request.session.get("is_login") #从session中获取登录状态
        if not is_login: #判断是不是true
            return redirect("/login_session/")
    
        username= request.session.get("username") #从session中获取用户名
        login_time = request.session.get("login_time")  #从session中获取登录时间
        return render(request,"index.html",{"username":username,"login_time":login_time})
    
    #注销
    def logout(request):
        request.session.flush() #清理session
        return redirect("/login_session/")
  • 相关阅读:
    [洛谷P5408]第一类斯特林数·行
    11 React 组件生命周期
    10 React 组件 API
    9 React 列表 & Keys
    8 React 条件渲染
    7 React 事件处理
    6 React Props
    5 React State(状态)
    4 React 组件
    3 JSX语法
  • 原文地址:https://www.cnblogs.com/kenD/p/10098462.html
Copyright © 2011-2022 走看看