在Django里面,使用Cookie和Session看起来好像是一样的,使用的方式都是request.COOKIES[XXX]和request.session[XXX],其中XXX是您想要取得的东西的key,但是这两者的原理和实现方式确是非常的不同。
  
  首先介绍Cookie,只要是HTTP协议,就会有COOKIE这个东西; 只要您的浏览器没有禁用Cookie,就  可是使用它。而且是不分用什么语言,用什么框架,因为这是在HTTP协议的层面支持的,浏览器会把您设置的XXX的这个Cookie在Response之后保存到您的本地机器,在下次您向服务器提交或者浏览的时候会把上次保存下来的COOKIE带上发送向服务器;说到这里我们应该澄清一个概念,就是BS结构理论上是没有同步的服务器-客户端的状态维持的,所以Cookie本质上就是一种异步的状态维护,所有这一切浏览器都帮我们搞定了,所以不用关心。 当然如果使用是Django的话,最终的HttpRequest也许是WSGIRequest(调试的时候使用WSGI方式),也许是ModPythonRequest(使用Apache+Mod_python的方式),甚至您自己写自己的实现方式,但是最终我们都可以看到,他们都是一个HTTP协议要求的Requset的实现;

  接下来介绍Session, 其他的框架当中是否也有Session这个东东我不知道,至少Django的这个东东是非常有用的。我们都知道Django可以同过meddleware来修改requset和response,如果想使用Django当中Session,首先必须要求您的Django工程的settiongs.py文件里面的MIDDLEWARE_CLASSES设置里面已经包含有django.contrib.sessions.middleware.SessionMiddleware(其实默认就是有的)。接下来我们看看/django/contrib/sessions/middleware.py这个文件,里面定义了一个SessionMiddleware的class,其中的process_request函数之有一句话 request.session = SessionWrapper(request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)),我们所使用的request.session当中的sesson这个变量就是在这一刻诞生的,其实这个session就是一个SessionWrapper类,这个类是根据得到COOKIES里面的settings.SESSION_COOKIE_NAME来作为生成SessionWrapper的依据。
  看到这里大家留意没有?session其实是依赖于Cookie的,如果浏览器不支持Cookie的话,Django的Session也就无从用起了,因为Session的生成是根据Cookie里面记录的SESSION_COOKIE_NAME来生成的,那么这个Cookie是什么时候设置的呢? 接下来再看process_response过程,

def process_response(self, request, response):
# If request.session was modified, or if response.session was set, save
# those changes and set a session cookie.
patch_vary_headers(response, ('Cookie',))
try:
modified = request.session.modified
except AttributeError:
pass
else:
if modified or settings.SESSION_SAVE_EVERY_REQUEST:
session_key = request.session.session_key or Session.objects.get_new_session_key()
if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE:
max_age = None
expires = None
else:
max_age = settings.SESSION_COOKIE_AGE
expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT")
new_session = Session.objects.save(session_key, request.session._session, datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE))
response.set_cookie(settings.SESSION_COOKIE_NAME,
session_key, max_age=max_age, expires=expires,
domain=settings.SESSION_COOKIE_DOMAIN,
secure=settings.SESSION_COOKIE_SECURE or None
)
return response

  其他的不详说了,我们注意其中的两句 
session_key = request.session.session_key or Session.objects.get_new_session_key() 如果存在session_key就用,如果不存在就创建一个新的Seesion,并返回它的key。
response.set_cookie(settings.SESSION_COOKIE_NAME, session_key,........) 把 response设置上这个settings.SESSION_COOKIE_NAME这个Cookie,改Cookie的值为session_key.
  回过头来我们再看看process_request,其实我们最初的第一次浏览一个Django作的网站的时候,process_request函数是得不到叫做SESSION_COOKIE_NAME的这个Cookie的,但是在剩下的网站的第一次response之后,这个Cookie就出现了。process_request函数根据SESSION_COOKIE_NAME这个Cookie记录的session_key来创建了一个SessionWrapper这个类的一个实例,以后我们使用的request.session就是这个SessionWrapper,其实SessionWrapper就是对Session这个Model的封装(具体如何封装我详细讲了,有兴趣自己看一下),我们同过对request.session[XXX]=****这样的操作最终到保存到了数据库当中Session这个Model对应的表;

  最后,既然有了Cookie,为什么还需要Session呢?? 因为不能Cookie保存太多的东西,而且保存的类型仅限于字符串。比如我们使用request.COOKIES[XXX]=您自己创建的一个类的实例,这样这个类的实例是绝对不能传送到客户端本地的,所以这时候session就派上用场了,这样在客户端的Cookie只是记录了一个key,这个key用来说明服务器端的那个数据是这个客户端的,至于服务器端的这个key的那条记录,就可以保存N多东西了,因为这个数据是一个字典,同过pickle保存和还原。

###############################################################

#一、存取Cookies

#   1、设置Cookies
#       response.set_cookie("cookie_key","value")
#   2、获取Cookies
#       value = request.COOKIES["cookie_key"]
#   3、删除Cookies
#       response.delete_cookie("cookie_key",path="/",domain=name)
#   4、检测Cookies
#       if "cookie_name" is request.COOKIES :
#   5、response.set_cookie() 传递一些可选的参数 描述:

#       参数          缺省值       描述
#       max_age  None         cookies的持续有效时间(以秒计),如果设置为 None cookies 在浏览器关闭的时候就失效了。
#       expires     None         cookies的过期时间,格式: "Wdy, DD-Mth-YY HH:MM:SS GMT" 如果设置这个参数,
#                                      它将覆盖 max_age 参数。
#       path         "/"            cookie生效的路径前缀,浏览器只会把cookie回传给带有该路径的页面,这样你可以避免将
#                                      cookie传给站点中的其他的应用。
#                                      当你的应用不处于站点顶层的时候,这个参数会非常有用。
#       domain     None        cookie生效的站点。你可用这个参数来构造一个跨站cookie。如, domain=".example.com"
#                                      所构造的cookie对下面这些站点都是可读的: www.example.com 、 www2.example.com 和
#                                      an.other.sub.domain.example.com 。
#                                      如果该参数设置为 None ,cookie只能由设置它的站点读取。
#       secure      False        如果设置为 True ,浏览器将通过HTTPS来回传cookie。

#二、Cookies规则
#    1、Cookies是以字典方式存储,(Key—>Value的键值对方式存储),访问是只要访问Session的键就可以得到键对应的Value
#       如果:value = response.set_cookie("cookie_key","value")
#    2、存储到客户端
#       优点:
#           数据存在在客户端,减轻服务器端的压力,提高网站的性能。
#       缺点:
#           1、安全性不高:在客户端机很容易被查看或破解用户回话信息
##################################################################

from django.template import Context
from django.http import HttpResponse
from django.http import HttpResponseRedirect
import datetime
def set_user(request,hour=0,name="admin"):

    dt = datetime.datetime.now() + datetime.timedelta(hours = int(hour))
html ="设置用户%s为登录回话,过去时间:%s" % (name,str(dt))
response = HttpResponse(html)
response.set_cookie("username",name,expires=dt)
return response def show_user(request):
html = ""
if "username" in request.COOKIES :
name = request.COOKIES["username"]
if name == "admin":
html = "用户%s 的Cookies 没有超时" % name
if name == "loker" :
html = "用户%s 的Cookies 没有超时" % name
else:
dt = datetime.datetime.now() + datetime.timedelta(hours = int(1))
name ="loker"
html ="用户的Cookies 已经超时\n设置用户%s为登录回话,过去时间:%s" % (name,str(dt))
response = HttpResponse(html) response.set_cookie("username",name,expires=dt) return response
response = HttpResponse(html)

#######################################################################################
# 一、开始Sessions功能:      --正常情况下,你无需任何设置就可以使用session功能。如果你删除或修改过请检测一下配置
#      1、编辑settings.py中 MIDDLEWARE_CLASSES 配置, 确保 'django.contrib.sessions.middleware.SessionMiddleware'存在,如果没有则添加。
#      2、编辑settings.py中INSTALLED_APPS 配置,确保'django.contrib.sessions' (如果你是刚打开这个应用,别忘了运行 manage.py syncdb )
#
#二、怎么使用:
#     1、设置Sessions值
#           request.session['session_name'] ="admin"
#     2、获取Sessions值
#           session_name = request.session["session_name"]
#     3、删除Sessions值
#           del request.session["session_name"]
#     4、检测是否操作session值
#           if "session_name" is request.session :
#三、sessions规则:
#     1、session是以字典方式存储,(Key—>Value的键值对方式存储),访问是只要访问Session的键就可以得到键对应的Value
#       如果:value = request.session["key_name"]
#     2、Session字典中以下划线开头的key值是Django内部保留key值。框架只会用很少的几个下划线开头的session变量,
#       除非你知道他们的具体含义,而且愿意跟上Django的变化,否则,最好不要用这些下划线开头的变量,它们会让D
#       jango搅乱你的应用。
#    3、不要用一个新对象来替换掉 request.session ,也不要存取其属性、
#    4、Session储存在服务器端,
#      优点:数据存储相对比较安全,数据交换方便。
#      缺点:如果存储数据多,访问量大时,比较消耗服务器端资源,导致网站整体性能下降。
########################################################################################

from django.template import Context
from django.http import HttpResponse
#设置Sessions值
def set_session(request,name=""):
# if "username" in request.session :
# del request.session['user_name']
request.session['user_name'] =name
return HttpResponse("Set a session key:%s value:%s"% ("username",name)) def del_session(request):
if "user_name" in request.session :
del request.session['user_name']
return HttpResponse("Clear an item from the session")
#查看Sessions值
def show_session(request):
html = ""
if "user_name" in request.session :
name = request.session["user_name"]
if name == "admin" :
html = "Django site administration | Get a session value:%s" % (str(name))
elif name=="lhj588":
html = "Django site |Get a session value:%s" % (str(name))
elif not name:
html = "Django site |Get a session value is null"
return HttpResponse(html)
else:
return HttpResponse("Session is null")
#set_session(request,"loker")

######################################################

# urls.py  配置

#######################################################

from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
(r'^cookies/showuser/$','cook.views.show_user'),
(r'^cookies/setuser/$','cook.views.set_user'),
(r'^session/setuser/(.*)/','cook.views.set_session'),
(r'^session/showuser/$','cook.views.show_session'),
(r'^session/del/$','cook.views.del_session'),
)

##############################################################
#测试

#############################################################

1、测试Cookies

设置Cookies      访问:http://127.0.0.1:8000/cookies/setuser/

  获取显示Cookies      访问:http://127.0.0.1:8000/cookies/showuser/

2、测试Sessions

 设置Session        访问:http://127.0.0.1:8000/session/setuser/admin/

获取显示Session  访问:http://127.0.0.1:8000/session/showuser/

清空Session        访问:http://127.0.0.1:8000/session/del/

转载自:http://blog.csdn.net/bravezhe/article/details/7711186

Django Cookie 和 Sessions 应用的更多相关文章

  1. django cookie、session

    Cookie.Session简介: Cookie.Session是一种会话跟踪技术,因为http请求都是无协议的,无法记录上一次请求的状态,所以需要cookie来完成会话跟踪,Seesion的底层是由 ...

  2. Django cookie相关操作

    Django cookie 的相关操作还是比较简单的 首先是存储cookie #定义设置cookie(储存) def save_cookie(request): #定义回应 response = Ht ...

  3. falsk 与 django cookie和session存、取、删的区别

    falsk cookie的存取删需导入from flask import Flask,make_response,request# 存COOKIE的方法@app.route('/setcookie') ...

  4. Django基础学习之Cookie 和 Sessions 应用

    在Django里面,使用Cookie和Session看起来好像是一样的,使用的方式都是request.COOKIES[XXX]和request.session[XXX],其中XXX是您想要取得的东西的 ...

  5. Django之路——8 cookie 和sessions

    会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...

  6. Python Web框架篇:Django cookie和session

    part 1 概念 在Django里面,cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话. 两者最大的区别是cookie的信息是存放在浏览器客户端的,而sessio ...

  7. python Django cookie和session

    在一个会话的多个请求中共享数据,这就是会话跟踪技术.例如在一个会话中的请求如下:  请求银行主页: 请求登录(请求参数是用户名和密码): 请求转账(请求参数与转账相关的数据): 请求信誉卡还款(请求参 ...

  8. Django Cookie和Seesion

    1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生.cookie的工作原理是:由服务器产生内容,浏览器 ...

  9. django cookie与session组件

    本文目录 1 会话跟踪技术 2 cookie介绍 Django中操作Cookie Session Django中Session相关方法 Django中的Session配置 CBV中加装饰器 回到目录 ...

随机推荐

  1. 集美大学网络1413第十二次作业成绩(个人作业3) -- Alpha阶段个人总结

    题目 个人作业3--个人总结(Alpha阶段) 优秀作业链接:**068 未交:**087 个人作业3成绩 学号 姓名 总结(4) 5个问题(2.5) 自我评价(2.5) 博客互动 (1) 总分(10 ...

  2. 201521123026 《Java程序设计》第6周学习总结

    1. 本章学习总结 请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结 2. 书面作业 Q1.clone方法 1.1 Object对象中的clone方法是被prot ...

  3. 201521123039 《java程序设计》第十周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 总结:需要 ...

  4. 201521123122 《java程序设计》第十周学习总结

    ## 201521123122 <java程序设计>第十周实验总结 ## 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次P ...

  5. 201521123001《Java程序设计》第11周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  6. SVM原理以及Tensorflow 实现SVM分类(附代码)

    1.1. SVM介绍 1.2. 工作原理 1.2.1. 几何间隔和函数间隔 1.2.2. 最大化间隔 - 1.2.2.0.0.1. \(L( {x}^*)\)对$ {x}^*$求导为0 - 1.2.2 ...

  7. python 实现登录程序

    本文介绍一个用python 实现的登录程序.python新手们可以参考一下. 用户信息存放于一个文件中,需要引入文件,校验输入的用户名.密码是否跟用户列表中的用户名密码相匹配,如果匹配,这登录成功,否 ...

  8. 开发中mysql和oracle的区别

    首先就不描述mysql与oracle在整个数据库系统上的区别了,仅从程序员开发的角度来说: 1.主键: mysql一般会用到一个自增的属性,例如设置一个id字段,类型设置为auto increment ...

  9. 二叉树终极教程--BinarySearchTree

    BinarySearchTreeMap 的 实现 public interface Map<K extends Comparable<K>, V> { void put(K k ...

  10. AngularJS的运用

      前  言 JRedu AngularJS[1]  诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.A ...