django13:Session与Cookie操作

Session与Cookie

cookie

服务端保存在客户端浏览器上的信息都可以教cookie

表现形式一般是k:v键值对(可以多个)

 

优化:

随机字符串1:用户1相关信息

随机字符串2:用户2相关信息

 

session

数据是保存在服务端

表现形式一般是k:v键值对

session是基于cookie工作。(大部分保存用户状态的操作都需要cookie)

 

token

session虽然数据保存在服务端,但是禁不住数据量大。

服务端不再保存数据

      登陆成功后,将一段信息进行加密处理(加密算法是自己开发)

      将加密后的结果拼在信息后面,整体返回给浏览器保存

     浏览器下次访问带着该数据信息,服务端自动切去前面一段信息再次使用自己加密算法

    跟浏览器尾部的密文进行对比

 

jwt认证

三段信息,后续补充。。。。

 

Cookie操作

浏览器禁用cookie,网站保存账户功能失效。

获取Cookie

request.COOKIES当成一个字典

request.COOKIES['key']  或者  request.COOKIES.get('username')    username是key
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

参数:

  • default: 默认值
  • salt: 加密盐
  • max_age: 后台控制过期时间

设置Cookie

一定要用HttpResponse类直接或者间接产生的对象

obj = HttpResponse(...)
obj = render(request, ...)

obj.set_cookie(key,value,...)
obj.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)

参数:

  • 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获取(不是绝对,底层抓包可以获取到也可以被覆盖

 

删除Cookie

obj = HttpResponse(...)
obj = render(request, ...)
obj.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值

Cookie版登陆校验

def check_login(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        next_url = request.get_full_path()
        if request.get_signed_cookie("login", salt="SSS", default=None) == "yes":
            # 已经登录的用户...
            return func(request, *args, **kwargs)
        else:
            # 没有登录的用户,跳转刚到登录页面
            return redirect("/login/?next={}".format(next_url))
    return inner


def login(request):
    if request.method == "POST":
        username = request.POST.get("username")
        passwd = request.POST.get("password")
        if username == "xxx" and passwd == "dashabi":
            next_url = request.GET.get("next")
            if next_url and next_url != "/logout/":
                response = redirect(next_url)
            else:
                response = redirect("/class_list/")
            response.set_signed_cookie("login", "yes", salt="SSS")
            return response
    return render(request, "login.html")

@check_login
def home(request):
    return HttpResponse("home页面,只有登陆了才能查看~")

 

session操作

note:

1. django 默认存放django_session。需要迁移命令生成表格,才能存放session,也可以保存到其他地方。

2. django中默认的session超时时间为14天

request.session['key'] = value		
    1.django内部会自动生成一个随机字符串
    2.去django_session表中存储数据 键就是随机字符串 值是要保存的数据(中间件干的)
    3.将生成好的随机字符串返回给客户端浏览器   浏览器保存键值对
    sessionid  随机字符串		
	

request.session.get('key')
    1.django会自动取浏览器的cookie查找sessionid键值对 获取随机字符串
    2.拿着该随机字符串取django_session表中比对数据
    3.如果比对上了 就将随机字符串对应的数据获取出来并封装到request.session供用户调用

 

1. django session表中的数据条数取决于浏览器

    同一台计算机同一个浏览器指挥有一条

 

设置session与cookie的超时时间

 

request.session.set_expiry(value)
		* 整数,session会在些秒数后失效。
		* datatime或timedelta,session就会在这个时间后失效。
		* 0,用户关闭浏览器session就会失效。
		* 不写(none),session会依赖全局session失效策略。

 

删除session

request.session.flush() #浏览器和服务端都清空,推荐使用。

 

Session登陆验证

from functools import wraps


def check_login(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        next_url = request.get_full_path()
        if request.session.get("user"):
            return func(request, *args, **kwargs)
        else:
            return redirect("/login/?next={}".format(next_url))
    return inner


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

        if user == "alex" and pwd == "alex1234":
            # 设置session
            request.session["user"] = user
            # 获取跳到登陆页面之前的URL
            next_url = request.GET.get("next")
            # 如果有,就跳转回登陆之前的URL
            if next_url:
                return redirect(next_url)
            # 否则默认跳转到index页面
            else:
                return redirect("/index/")
    return render(request, "login.html")


@check_login
def logout(request):
    # 删除所有当前请求相关的session
    request.session.delete()
    return redirect("/login/")


@check_login
def index(request):
    current_user = request.session.get("user", None)
    return render(request, "index.html", {"user": current_user})

补充:

有时一些数据可以存入session,django_session表中。

eg:验证码

 

 

参考:https://www.cnblogs.com/guyouyin123/p/12297103.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值