django cookie和session

1. cookie和session的定义

Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器,服务器会生成两份相同的cookie字符串,一份保存在本地,一份发向请求的浏览器。浏览器将收到的cookie字符串保存下来,当下次再发请求时,会将信息与这段cookie一同发送到服务器,服务器得到这段cookie会与本地保存的那份判断是否相同,如果相同就表示用户已经登录成功,保存用户登录成功的状态。HTTP被设计为”无状态”,每次请求都处于相同的空间中。 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来自同一人的连续请求。cookie的作用就是为了解决HTTP协议无状态的缺陷。

cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

Django的Session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,Django默认会把session存入到数据库中。

Session依赖于Cookie,如果浏览器不能保存cookie那么session就失效了。因为它需要浏览器的cookie值去session里做对比。session就是用来在服务器端保存用户的会话状态。

cookie和session的区别:

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

3、session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。而cookie保管在客户端,不占用服务器资源。考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,每个web服务器保存的cookie数不能超过20个。

Django中操作session

获取session:request.session.get(key)

设置session:request.session[key] = value

删除session:del request[key]

views.py

def login(request):
    ret = {'message':None}
    if request.method == 'POST':
        name = request.POST.get('username')
        pwd = request.POST.get('password')
        if name == 'hay' and pwd == '124':
            #设置session的值
            request.session['is_login'] = {'userv':name}
            return HttpResponseRedirect('/app07/index/')
        else:
            ret['message'] = '用户名密码错误'
            return render_to_response('app07_login.html',context=csrf(request))
    return render_to_response('app07_login.html',context=csrf(request)) #封装(request)上下文处理器,生成token
    
def index(request):
    #获取session的值
    user_dict = request.session.get('is_login',None)
    if user_dict:
        return render_to_response('app07_index.html',{'user':user_dict['userv']})
    else:
        return HttpResponseRedirect('/app07/login/')

app07_login.html

<form method="POST" action="/app07/login/">
        {% csrf_token %}
         用户名:<input type="text" name="username">
         密码:  <input type="text" name="password">
                <input type="submit" value="提交">
                <div>{{ message }}</div>
</form>

app07_index.html

<h2>主机管理</h2>
<h3>当前登陆用户:{{ user }}</h3>
<li>用户管理</li>
<li>主机管理</li>
<li>密码管理</li>

<a href="/app07/login/">退出</a>

在login页面中,当登陆成功后会设置session值,使用session可以保证不能直接访问index页面。在index页面,只有获取到session的值,才能访问。

 总结:

  在django中要用session要先执行:

  python manage.py makemigrations

  python manage.py migrate

  配置settings.py文件

  SESSION_COOKIE_AGE = 100 Session的cookie失效日期

参考链接:http://www.cnblogs.com/shiyangxt/articles/1305506.html

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

 

原文地址:https://www.cnblogs.com/homle/p/8654966.html