一:目录

  1)session原理

  2)cookie与session对比

  3)session配置

  4)session使用

  5)示例

二:session原理

  Django的Session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。

  它存在于服务器,Django默认会把session存入到数据库中。

  Session依赖于Cookie,如果浏览器不能保存cooki那么session就失效了(比如清空浏览器缓存)。

  因为它需要浏览器的cooki值去session里做对比。session就是用来在服务器端保存用户的会话状态。

  session是保存在服务器端的键值对(是保存在内存中)
  比如登陆:用户提交登陆成功后,seesion会给客户端随机生成个字符串,发给客户端,并保存在内存或者数据库中,

  下次在来的时候,客户端带字符串,会和session中的字符串比对。
    session字典示例如下:

    session={
    adbssdff{
      "is_login":True,
      "user:"XX",
      }

    }

  在做seesion 之前先要运行
  python manage.py makemigrations
  python manage.py migrate

  session的是保存中表中:django_session

  图1显示的是浏览器session字典,图2显示session数据库。

  

三: cookie与session对比

   最重要的区别:cookie是保存在客户端上,session保存在服务器上。

    详细比较参考

      http://www.cnblogs.com/chenchao1990/p/5283725.html

      http://blog.csdn.net/erjian666/article/details/53781387

  

  Cookie和Session的区别

1、存放位置不同

Cookie保存在客户端,Session保存在服务端。

2 、存取方式的不同

Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。

而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管JavaBean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。

3、安全性(隐私策略)的不同 

Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。

  4、有效期上的不同 

只需要设置Cookie的过期时间属性为一个很大很大的数字,Cookie就可以在浏览器保存很长时间。 由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。

  5、对服务器造成的压力不同 

Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。

  6、 跨域支持上的不同

Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。

四:session配置

  Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

    •   数据库(默认)
    •   缓存
    •   文件
    •   缓存+数据库
    •   加密cookie

  1)数据库Session

  

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

    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,默认修改之后才保存(默认)

  2)缓存Session

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 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)文件Session

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile
模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T 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,默认修改之后才保存

  4)缓存+数据库Session

  

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

  5)加密cookie Session

  

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

五:session使用方法

        # 获取、设置、删除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的随机字符串
request.session.session_key # 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key") # 删除当前用户的所有Session数据
request.session.delete("session_key")
# 删除当前用户的所有Session数据
request.session.delete("session_key")
#清空所有的当前用户的所有KEY request.session.clear()
==request.session.delete(request.session.session_key) request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

  1)当set_cookie("k1","v1‘)如果后面没有设置,默认就是关闭浏览器使得Session过期。

  2)request.session.set_expiry(10)设置超时10秒,是从开始计时,这不合理,应该每次操作后10秒。

    就是每次用户发来请求都更新下时间。在settings.py SESSION_SAVE_EVERY_REQUEST = TRUE,每次请求后推迟10秒。 

六:示例

  示例1:session设置和获取 

    #示例1:session设置,获取等
#urls.py
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^index/', views.index),
] #views.py from django.shortcuts import render,redirect,HttpResponse # Create your views here. def login(request):
if request.method=="GET":
return render(request,"login.html")
elif request.method=="POST":
u=request.POST.get("username")
p=request.POST.get("password")
if u=="root" and p=="":
#生成随机字符串
#写到用户浏览器cookie
#保存到session
#在随机字符串对应的字典中设置相关内容 request.session["username"]=u #上面的4步就设置完了
request.session["is_login"]=True
return redirect("/index/")
else:
return render(request,"login.html") def index(request):
if request.session["is_login"]:
return HttpResponse(request.session["username"])
else:
return HttpResponse("未登陆") #login.html
<form action="/login/" method="post">
<input type="text" name="username">
<input type="text" name="password">
<input type="submit" name="+">
</form>

  示例2:注销

##示命2
# 删除当前用户的所有Session数据
request.session.delete("session_key")
request.session.clear()==request.session.delete(request.session.session_key) 什么时候用:注销 #views.py def login(request):
if request.method=="GET":
return render(request,"login.html")
elif request.method=="POST":
u=request.POST.get("username")
p=request.POST.get("password") if u=="root" and p=="":
#生成随机字符串
#写到用户浏览器cookie
#保存到session
#在随机字符串对应的字典中设置相关内容
request.session["username"]=u #上面的4步就设置完了
request.session["is_login"]=True if request.POST.get("rmb")=="":
#设置10秒超时,不设置django默认是两周
request.session.set_expiry(10)
print(1) return redirect("/index/")
else:
return render(request,"login.html") def index(request):
if request.session.get("is_login"):
return render(request,"index.html")#request中包含session,模块可以直接使用
else:
return HttpResponse("未登陆") def logout(request):
if request.method=="GET":
request.session.clear()
return redirect("/login/") <body>
{{ request.session.username }}
<a href="/logout/">注销</a>
</body>

20)django-session使用的更多相关文章

  1. Redis+Django(Session,Cookie)的用户系统

    一.Django authentication django authentication提供了一个便利的user api接口,无论在py中 request.user,参见Request and re ...

  2. Redis+Django(Session,Cookie、Cache)的用户系统

    转自 http://www.cnblogs.com/BeginMan/p/3890761.html 一.Django authentication django authentication 提供了一 ...

  3. django session

    上周一个新的应用场景,带出来了关于django session管理的问题. 公司的另一个App以Widget的形式嵌入我们的页面,就是我们提供一些url,另一个App通过iframe的形式嵌入这些ur ...

  4. Django session相关操作

    Django session 是存储在数据库中的所以要先跟数据库建立连接 本连接有Django跟数据库建立连接的操作:https://www.cnblogs.com/Niuxingyu/p/10296 ...

  5. Django session 源码流程

    流程 Django session源码流程 首先执行的是SessionMiddleware的init方法 import_module(settings.SESSION_ENGINE) 导入了一个 dj ...

  6. Django - session 会话跟踪技术

    1.session简介 |session 英 /'seʃ(ə)n/ 美 /'sɛʃən/ 基于cookies开发,将值存到服务端 写session 读session Session是服务器端技术,利用 ...

  7. django session 使用案例

    django session 使用案例 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来 ...

  8. Django 2.0 学习(21):Django Session

    Django Session Session 与Cookie 1.简介 1.Cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们又需要"保持状态",因 ...

  9. Django Session配置

    Django Session的三种存储方式 SESSION_ENGINE='django.contrib.sessions.backends.db' # default 保存到数据库中,依赖 'dja ...

  10. python Django session/cookie

    一, Cookie #cookie # def cook1(request): # print(request.COOKIES) # 查看cooke # # print(request.get_sig ...

随机推荐

  1. C#调用C++导出类的一个实例

    一直认为带导出类dll的只有VC自己可以调用,其它编程语言无法调用,今天看到一篇文章才知道自己错了.https://blog.csdn.net/huiyouyongdeyu2011/article/d ...

  2. Linux文件权限设置

    基本概念 https://linux.cn/article-7418-1.html#3_8880 用户管理 文件权限设置 -添加用户账户08% -理解 /etc/passwd 中的内容12% -理解 ...

  3. lua 设置文件运行的环境

    背景 在一个lua文件中书写的代码, 使用的变量, 需要设置其运行环境. 目的: 1. 不破坏全局环境. 2. 限定文件所使用的环境, 作为沙箱功能. 解法 限定运行空间环境的文件: local m ...

  4. Javaweb学习笔记——(二十)——————Javaweb监听器、国际化

    Javaweb监听器     三大组件         *Servlet         *Listener         *Filter Listener:监听器         1.初次相见:A ...

  5. Javaweb学习笔记——(十一)——————JSP、会话跟踪、Cookie、HttpSession

    JSP1.什么是JSP jsp即java server pages,它是Javaweb的动态资源. jsp = html + java脚本 + jsp动态标签(包含EL表达式)2.JSP中java脚本 ...

  6. 使用js请求Servlet时的路径

    项目结构如下: 全是web的html页面 js部分重要代码: function ajaxValidate() { var flag=false; $.ajax({ "url":&q ...

  7. 二十三、Linux 进程与信号---进程链和进程扇、守护进程和孤儿进程以及僵尸进程

    23.1 进程链和进程扇 23.1.1 概念 进程链:一个父进程构建出一个子进程,子进程再构建出子子进程,子子进程构建出子子子进程.... 这种就为进程链 进程扇:一个父进程构建出多个子进程,子进程都 ...

  8. 二叉搜索树BST

    //遍历 void print(int p){ if(!p) return; print(left[p]); printf("%d\n",a[p]); print(right[p] ...

  9. ubuntu18.04中安装和卸载cuDNN

    udnn安装注意点: cudnn的安装其实很简单,关键点是一定要安装cuda对应的cudnn包,本机中安装的cuda7.5所以对应的cudnn为v5.1这很重要,我就是安装错了版本,导致后面caffe ...

  10. [C++]PAT乙级1008.数组元素循环右移问题 (20/20)

    /* 1008. 数组元素循环右移问题 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 一个数组A中存有N(N>0)个整数, ...