django会话

可以把会话理解为客户端与服务器之间的一次会晤,在一次会话过程中有多次请求和响应,但是由于HTTP协议的特性-->无状态,每次浏览器的请求都是无状态的,无法保存状态信息,也就是说后台服务器不知道当前请求是否和上一次的请求是来自同一个用户的,试想一下,淘宝京东,无法识别用户并保存用户的状态是致命的。

一、cookie的原理

为了保持连接状态,便有了cookie的由来,cookie是存储在本地服务器上的一个key-value结构的数据,类似于python中的字典,通过cookie除了可以保存连接状态,还可以保存用户信息等数据。

客户端发起请求,服务端生成cookie响应浏览器,这时客户端会将cookie保存起来,当下一次访问服务器的时候会将cookie一起发送给服务器,服务器通过cookie判断是谁的访问

注:如果服务端发送重复的cookie,会覆盖原有的cookie

二、django中操作cookie

1.启用会话

Django通过一个内置中间件来实现会话功能

编辑settings.py中的MIDDLEWARE设置

django.contrib.sessions.middleware.SessionMiddlewar

2.配置会话引擎

1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
然后运行 manage.py migrate 在数据库内创建sessions表 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,默认修改之后才保存(默认)

3.在视图中操作cookie

3.1设置cookie

def set_cookie(request):
obj = HttpResponse('ok') #obj=render(request,...)
obj.set_cookie('name', 'ABC')
# obj.set_signed_cookie(key,value,salt='加密盐')
obj.set_signed_cookie('name','lqz',salt='123')#加盐,123是个密码,解cookie的时候需要它,
return obj

参数:

  • key--->键
  • value--->值
  • max_age=None--->超时时间,cookie延续的时间,以秒为单位,
  • 超时时间expires,传一个datatime对象
  • path='/',可以设置路径,设置路径之后,path='/index/',只有访问index的时候,才会携带cookie过来
  • domain 设置域名下有效domain='map.baidu.com'
  • secure=False, (默认是false,设置成True浏览器将通过HTTPS来回传cookie)
  • httponly=True 只能https协议传输,阻止javascript对会话数据的访问,提高安全性。(不是绝对,底层抓包可以获取到也可以被覆盖)

3.2获取cookie

def get_cookie(request):
print(type(request.COOKIES))
# 取cookie的值
print(request.COOKIES)
name=request.COOKIES.get('name') #加盐,123是个密码,解cookie的时候需要它,
# request.get_signed_cookie(key, default=RAISE_ERROR, salt='123', max_age=None) obj = HttpResponse('get_cookie')
return obj

3.3删除cookie

def logout(request):
rep = redirect("/login/")
rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值
return rep

三、session

cookie本身保存在客户端,可能被拦截或窃取,所以网站设计通常将Cookie用来保存一些不重要的内容,实际的用户数据和状态还是以Session会话的方式保存在服务器端。

Session就是在服务器端的‘Cookie’,Session依赖Cookie!

给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。

1.设置session

def set_session(request):
# 写session,干了三件事(每个浏览器会生成一个随机字符串)
# 随机字符串是跟浏览器相关的,数据是跟账号相关的
request.session['name']='ABC'
request.session['age']='18'
request.session['sex']='男' '''
非django的步骤(django已经封装了下面的操作)
1 生成随机字符串:dfasfasdfa
2 去数据库存储
随机字符串 值 (字典形式) 超时时间
dfasfasdfa {'name':'ABC','age':18,'sex':'男'} 超时时间
3 写入set_cookie(set_cookie('sessionid','dfasfasdfa')) 发送给客户端
'''
return HttpResponse('ok')

2.获取session

def get_session(request):
# 取session 取name这个字段对应的值
name=request.session['name'] # 正常流程 非django的步骤(django已经封装了下面的操作)
# 去cookie中取出随机字符串
# 去session那个表去查询,取出session_data的数据,解密成字典,然后取name的值返回
# print(name)

3.删除session

# 删除当前会话的所有Session数据(只删数据库)
request.session.delete()
  
# 删除当前的会话数据并删除会话的Cookie(数据库和cookie都删)。
request.session.flush()
这用于确保前面的会话数据不可以再次被用户的浏览器访问
例如,django.contrib.auth.logout() 函数中就会调用它。

四、session的相关方法

# 所有 键、值、键值对
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和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

序列化会话

Django默认使用JSON序列化会话数据。你可以在SESSION_SERIALIZER设置中自定义序列化格式,甚至写入警告说明。但是强烈建议你还是使用JSON,尤其是以cookie的方式进行会话时。

django会话的更多相关文章

  1. 第二十二章 Django会话与表单验证

    第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...

  2. django——会话追踪技术

    1.引言 1.1什么是会话追踪技术 会话是指一个终端用户(服务器)与交互系统(客户端)进行通讯的过程. 1.2 什么是会话跟踪 对同一个用户对服务器的连续的请求和接受响应的监视.(将用户与同一用户发出 ...

  3. django会话session

    因为因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的.独立的.通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用户.对于静 ...

  4. django会话跟踪技术

    目录 django中的会话跟踪技术 什么是会话跟踪技术 HTTP无状态协议 Cookie概述 什么是cookie cookie源码 cookie超长时间 cookie超长时间 cookie生效路径 删 ...

  5. Django会话,用户和注册之用户认证

    通过session,我们可以在多次浏览器请求中保持数据, 接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们需要认证. 当然了,Django 也提供 ...

  6. Django会话,用户和注册之session

    鉴于cookie的不安全,django自带的session框架会帮我们搞定这些问题 你可以用session 框架来存取每个访问者任意数据, 这些数据在服务器端存储,并对cookie的收发进行了抽象. ...

  7. Django会话,用户和注册之cookie

    HTTP状态和TCP不一样,HTTP是无状态的,也就是这一次请求和下一次请求之间没有任何状态保持,我们无法根据请求例如IP来识别是否在同一人的连续性请求.就像我们在访问网站的时候,输入了用户名和密码, ...

  8. django 学习-16 Django会话Cookie

    1.django.admin.py  startproject   cs3 cd cs3 django.admin.py   startapp   blog 2.    vim urls.py url ...

  9. Django会话cookie&session

    任务描述:实现登录和退出 1.项目结构 2.源代码 urls.py from django.conf.urls import url from django.contrib import admin ...

随机推荐

  1. 熟悉常用的HBase操作

    1. 以下关系型数据库中的表和数据,要求将其转换为适合于HBase存储的表并插入数据: 学生表(Student)(不包括最后一列) 学号(S_No) 姓名(S_Name) 性别(S_Sex) 年龄(S ...

  2. BZOJ 2733 永无乡

    splay启发式合并 启发式合并其实就是把集合数量小的合并到集合数量大的里去. 怎么合并呢,直接一个一个插入就行了.. 用并查集维护连通性,find(i)可以找到所在splay的编号 这题好像还可以合 ...

  3. mysql学习基础知识3

    1.视图 简化sql语句的编写,限制可以查看的数据 一张虚拟的表,不占任何内存,查视图时都是临时从所查的表中拿数据 特点: 对于视图的增删改查 都会同步到原始表 对原始表的修改,会同步到视图内可查看的 ...

  4. BZOJ 3000: Big Number (数学)

    题目: https://www.lydsy.com/JudgeOnline/problem.php?id=3000 题解: 首先n很大,O(n)跑不过,那么就要用一些高端 而且没听过 的东西——sti ...

  5. 通用的C#导出Excel 支持2003及2007以上版本

    将数据导出到Excel,供用户下载是经常要使用到的一个功能,我这里进行了一些封装,目前已满足项目中导出的需求,使用DataReader导出Excel,支持自定义多表头,使用委托处理字段格式化及字段值的 ...

  6. P1962 斐波那契数列-题解(矩阵乘法扩展)

    https://www.luogu.org/problemnew/show/P1962(题目传送) n的范围很大,显然用普通O(N)的递推求F(n)铁定超时了.这里介绍一种用矩阵快速幂实现的解法: 首 ...

  7. 远程代理模式-Remote Proxy(Java实现)

    远程代理模式-Remote Proxy 服务端通过rmi将对象注册到远程服务, 客户端使用时, 只需要通过rmi协议获取即可, 只要接口统一, 即可不需要知道内部具体实现, 直接调用使用. Compa ...

  8. jq常用事件(on,blur,focus,change),js/jq等待图片(页面)加载完毕事件,js读取文件

    jq常用事件(on,blur,focus,change) // 方法一(推荐) $('.box').on( "click",function() {} ) $('.box').on ...

  9. hive group by聚合函数增强

    1.grouping sets grouping sets子句都可以根据UNION连接的多个GROUP BY查询进行逻辑表示 SELECT a,b,SUM(c)FROM tab1 GROUP BY a ...

  10. 六十一、linux 编程—— 守护进程

    61.1 介绍 守护进程(daemon)是生存期长的一种进程.它们常常在系统引导装入时启动,在系统关闭时终止 守护进程也称为后台进程 所有守护进程都以超级用户(用户 ID 为0)的优先权运行. 守护进 ...