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 innerdef 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 responsereturn 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 wrapsdef 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 innerdef login(request):if request.method == "POST":user = request.POST.get("user")pwd = request.POST.get("pwd")if user == "alex" and pwd == "alex1234":# 设置sessionrequest.session["user"] = user# 获取跳到登陆页面之前的URLnext_url = request.GET.get("next")# 如果有,就跳转回登陆之前的URLif next_url:return redirect(next_url)# 否则默认跳转到index页面else:return redirect("/index/")return render(request, "login.html")@check_login
def logout(request):# 删除所有当前请求相关的sessionrequest.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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从Windows XP升级? 这是您需要了解的Windows 7

With Windows XP reaching the end of its long support life, many businesses and individuals are avoiding Windows 8 and upgrading to Windows 7 instead. If you’re a latecomer to Windows 7, here are the basics you need to know. 随着Windows XP使用寿命的延长&am…

Java迭代器原理

1迭代器模式 迭代器是一种设计模式,这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 一般实现方式如下:(来自) public interface Iterator {public boolean hasNext();public Object next(); } pu…

企业版Java EE正式易主 甲骨文再次放手

有人说甲骨文收购的东西大多没有了好下场,这么说虽然有些片面,但是最近一个月Java EE和Solaris的境遇难免让人产生类似的联想。 继笔者上次报道《甲骨文将放弃Java EE 开源基金会双手欢迎》之后,最新消息显示,原本在甲骨文手中的J…

js中各种位置

js中各种位置 js中有各种与位置相关的属性,每次看到的时候都各种懵逼。索性一次总结一下。 clientHeight 内容可视区域的高度。包括padding不包括border、水平滚动条、margin。对于inline的元素这个属性一直是0,单位px,只读元素。offsetHeight offsetHei…

如何判断您是否拥有32位或64位版本的Google Chrome浏览器

Google Chrome is extremely popular with our readers, but did you know that they also have a 64-bit version of the browser these days? Here’s how to tell which version you are running, and how to switch if you aren’t. 谷歌浏览器在我们的读者中非常受欢迎&a…

django14:CBV加入装饰器

加在方法上面 from django.utils.decorators import method_decoratorclass HomeView(View):def dispatch(self, request, *args, **kwargs):return super(HomeView, self).dispatch(request, *args, **kwargs)def get(self, request):return render(request, "home.html&…

Kubernetes 跨集群流量调度实战 :访问控制

背景众所周知,Flomesh 的服务网格产品 osm-edge[1] 是基于 SMI(Service Mesh Interface,服务网格接口) 标准的实现。SMI 定义了流量标识、访问控制、遥测和管理的规范。在 上一篇 中,我们体验过了多集群服务&#xff0…

python下sqlite增删查改方法(转)

sqlite读写 #codingutf-8 import sqlite3 import os #创建数据库和游标 if os.path.exists( test.db):connsqlite3.connect( test.db)curconn.cursor() else:connsqlite3.connect( test.db)curconn.cursor()#创建表 cur.execute(CREATE TABLE IF NOT EXISTS customer (ID VARCH…

Apache HTTP Server 与 Tomcat 的三种连接方式介绍

本文转载自IBM developer 首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接。事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序,你也可以将该…

印象笔记和有道云笔记程序员_记录,存储和共享笔记的最佳应用程序和云服务...

印象笔记和有道云笔记程序员Is your desk and computer covered with sticky notes? Do you have miscellaneous pieces of paper with bits of information buried in drawers, your laptop case, backpack, purse, etc.? Get rid of all the chaos and get organized with …

java B2B2C 仿淘宝电子商城系统-Spring Cloud Eureka参数配置项详解

Eureka涉及到的参数配置项数量众多,它的很多功能都是通过参数配置来实现的,了解这些参数的含义有助于我们更好的应用Eureka的各种功能,下面对Eureka的配置项做具体介绍,供大家参考。 需要JAVA Spring Cloud大型企业分布式微服务云…

django15:中间件

中间件 开发django项目是,涉及全局相关功能,都可以使用中间件实现。 1.请求时,需要经过中间件,才能到达真正的django后端。 2.响应走的时候,也要经过中间件,才能出去。 依次经过里面的中间件进出&#x…

互联网算法和产品优化的几个反直觉现象

本文不涉及任何具体的业务和形态,没有公开任何数据和需要保护的技术。互联网产品和算法的优化,是广大程序员和产品经理的主要工作。但想准确衡量线上实验效果,从来都不简单。笔者将这些反直觉现象,总结成三个典型案例予以讨论。然…

SD 胡策 Round 1 T3 彩尾巴猹的二进制数

发现一个区间[L,R]代表的2进制数是3的倍数,当且仅当从L开始的后缀二进制值 - 从R1开始的后缀二进制值 是 3 的倍数 (具体证明因为太简单而被屏蔽)。 于是我们就可以在每个点维护从它开始的后缀二进制数的值,因为在%3同余系下只有3个数,所以我…

求解10的75次方问题

对于求一个数的高次方,最简单的方法,恐怕就是循环一定的次数,累乘。但是这样的效率太低。下面我提供一个高效的算法。来自左程云《程序员代码面试指南》。 就拿10的75次方举例: 1.75的二进制数形式是1001011。 2.10的75次方10的64…

又是新的一周

自己的决定还记得吗转载于:https://www.cnblogs.com/zhangxiangning/p/10300093.html

django16: csrf跨站请求伪造/CSRF相关装饰器

CSRF 即跨站请求攻击 跨站请求伪造csrf钓鱼网站本质搭建一个跟正常网站一模一样的页面用户在该页面上完成转账功能转账的请求确实是朝着正常网站的服务端提交唯一不同的在于收款账户人不同给用户书写form表单 对方账户的input没有name属性你自己悄悄提前写好了一个具有默认的…

dropbox_Google的新存储定价与Microsoft,Apple和Dropbox相比如何

dropboxGoogle’s subscription storage service has a new name: Google One. Some prices are dropping and customers will also get customer support from an actual human for the first time. Google的订阅存储服务有一个新名称:Google One。 一些价格正在下…

WPF效果第二百零六篇之快速黑白灰效果

一大早就看到群友讨论怎么快速让界面黑白灰效果,这不突然想起来N年前咱简单通过ShaderEffects调节过饱和度、对比度、亮度;今天再次玩耍一下;来看看最终实现的效果:1、核心代码:sampler2D implicitInput : register(s0); float factor : register(c0); float4 main(…

极大似然估计与贝叶斯定理

文章转载自:https://blog.csdn.net/zengxiantao1994/article/details/72787849 极大似然估计-形象解释看这篇文章:https://www.zhihu.com/question/24124998 贝叶斯定理-形象解释看这篇文章:https://www.zhihu.com/question/19725590/answer/…