Django—Cookie and Session

一、Cookie

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。

1. 应用

  • 服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。
  • Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。
  • 另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。

2. 获取Cookie

1 #获取普通Cookie
2 request.COOKIES[‘key‘]
3
4 #获取签名Cookie
5 request.get_signed_cookie(key, default=RAISE_ERROR, salt=‘‘, max_age=None)
6     参数:
7         default: 默认值
8            salt: 加密盐
9         max_age: 后台控制过期时间

3. 设置Cookie

#先获取views函数的返回对象
rep = HttpResponse(...) 或 rep = render(request, ...)

#设置普通Cookie,键值对
rep.set_cookie(key,value,...)

#设置签名Cookie
rep.set_signed_cookie(key,value,salt=‘加密盐‘,...)

参数:
        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获取(不是绝对,底层抓包可以获取到也可以被覆盖)

4. 操作Cookie

由于Cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。

<script src=‘/static/js/jquery.cookie.js‘></script>
$.cookie("list_pager_num", 30,{ path: ‘/‘ });

5. 应用Cookie进行用户登陆状态保持

 1 from django.shortcuts import render, HttpResponse, redirect
 2
 3
 4 #Cookie登陆验证装饰器
 5 def auth(func):
 6     def wrapper(request):
 7         tk = request.COOKIES.get(‘login_keys‘)  # 根据键获取cookies
 8         if not tk:  # 若cookie不存在,跳转至登陆页面
 9             return redirect(‘/login.html/‘)
10         else:
11             return func(request)    # 否则,执行当前url
12     return wrapper
13
14
15
16 #登陆验证,登陆成功则返回客户端Cookie
17 def login(request):
18     if request.method == ‘GET‘:
19         return render(request, ‘login.html‘)
20     else:
21         user_name = request.POST.get(‘user‘)    # 获取用户名
22         user_pwd = request.POST.get(‘pwd‘)  # 获取用户密码
23         if user_name == ‘jack‘ and user_pwd == ‘123‘:   # 若用户名和密码匹配
24             obj_cookie = HttpResponse(‘登陆成功!‘)
25             obj_cookie.set_cookie(‘login_keys‘, ‘123456‘, max_age=3600)     # 设置Cookie,有效期1小时
26             return obj_cookie
27         else:
28             return HttpResponse(‘密码错误‘)
29
30
31 @auth
32 def index(request):
33     return HttpResponse(‘welcome to index‘)

基于Cookie的登陆验证

二、Session

不同于Cookie,Session是保存在服务器端的会话数据。

在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。

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

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

1. 数据库Session

 1 Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
 2
 3 a. 配置 settings.py
 4
 5     SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘   # 引擎(默认)
 6
 7     SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
 8     SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
 9     SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
10     SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
11     SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
12     SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
13     SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
14     SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)
15
16
17
18 b. 使用
19
20     def index(request):
21         # 获取、设置、删除Session中数据
22         request.session[‘k1‘]
23         request.session.get(‘k1‘,None)
24         request.session[‘k1‘] = 123
25         request.session.setdefault(‘k1‘,123) # 存在则不设置
26         del request.session[‘k1‘]
27
28         # 所有 键、值、键值对
29         request.session.keys()
30         request.session.values()
31         request.session.items()
32         request.session.iterkeys()
33         request.session.itervalues()
34         request.session.iteritems()
35
36
37         # 用户session的随机字符串
38         request.session.session_key
39
40         # 将所有Session失效日期小于当前日期的数据删除
41         request.session.clear_expired()
42
43         # 检查 用户session的随机字符串 在数据库中是否
44         request.session.exists("session_key")
45
46         # 删除当前用户的所有Session数据
47         request.session.delete("session_key")
48
49         request.session.set_expiry(value)
50             * 如果value是个整数,session会在些秒数后失效。
51             * 如果value是个datatime或timedelta,session就会在这个时间后失效。
52             * 如果value是0,用户关闭浏览器session就会失效。
53             * 如果value是None,session会依赖全局session失效策略。

数据库Session

2. 缓存Session

 1 a. 配置 settings.py
 2
 3     SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘  # 引擎
 4     SESSION_CACHE_ALIAS = ‘default‘                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
 5
 6
 7     SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
 8     SESSION_COOKIE_PATH = "/"                                # Session的cookie保存的路径
 9     SESSION_COOKIE_DOMAIN = None                              # Session的cookie保存的域名
10     SESSION_COOKIE_SECURE = False                             # 是否Https传输cookie
11     SESSION_COOKIE_HTTPONLY = True                            # 是否Session的cookie只支持http传输
12     SESSION_COOKIE_AGE = 1209600                              # Session的cookie失效日期(2周)
13     SESSION_EXPIRE_AT_BROWSER_CLOSE = False                   # 是否关闭浏览器使得Session过期
14     SESSION_SAVE_EVERY_REQUEST = False                        # 是否每次请求都保存Session,默认修改之后才保存
15
16
17
18 b. 使用
19
20     同上

缓存Session

3. 文件Session

 1 a. 配置 settings.py
 2
 3     SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘    # 引擎
 4     SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
 5
 6
 7     SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
 8     SESSION_COOKIE_PATH = "/"                                  # Session的cookie保存的路径
 9     SESSION_COOKIE_DOMAIN = None                                # Session的cookie保存的域名
10     SESSION_COOKIE_SECURE = False                               # 是否Https传输cookie
11     SESSION_COOKIE_HTTPONLY = True                              # 是否Session的cookie只支持http传输
12     SESSION_COOKIE_AGE = 1209600                                # Session的cookie失效日期(2周)
13     SESSION_EXPIRE_AT_BROWSER_CLOSE = False                     # 是否关闭浏览器使得Session过期
14     SESSION_SAVE_EVERY_REQUEST = False                          # 是否每次请求都保存Session,默认修改之后才保存
15
16 b. 使用
17
18     同上

文件Session

4. 缓存+数据库Session

1 数据库用于做持久化,缓存用于提高效率
2
3 a. 配置 settings.py
4
5     SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db‘        # 引擎
6
7 b. 使用
8
9     同上

缓存提高效率,数据库保持持久

5. 加密cookie Session

a. 配置 settings.py

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

b. 使用

    同上

6. 应用Session进行用户登陆状态保持

 1 from django.shortcuts import render, HttpResponse, redirect
 2
 3
 4 #Session登陆验证装饰器
 5 def auth(func):
 6     def wrapper(request):
 7         tk = request.session.get(‘user‘)  # 根据键获取session
 8         if not tk:  # 若session不存在,跳转至登陆页面
 9             return redirect(‘/login.html/‘)
10         else:
11             return func(request)    # 否则,执行当前url
12     return wrapper
13
14
15
16 #登陆验证
17 def login(request):
18     if request.method == ‘GET‘:
19         return render(request, ‘login.html‘)
20     else:
21         user_name = request.POST.get(‘user‘)    # 获取用户名
22         user_pwd = request.POST.get(‘pwd‘)  # 获取用户密码
23         if user_name == ‘jack‘ and user_pwd == ‘123‘:   # 若用户名和密码匹配
24             request.session[‘user‘] = user_name # 写当前用户至session中
25             request.session.set_expiry(3600)  # 设置session,有效期1小时
26             return redirect(‘/index.html/‘)
27         else:
28             return HttpResponse(‘密码错误‘)
29
30
31 @auth
32 def index(request):
33     return HttpResponse(‘welcome to index‘)

基于Session的登陆状态验证

参考资料:

1. http://www.cnblogs.com/wupeiqi/articles/5246483.html

2. http://baike.baidu.com/item/Cookies/187064

3. http://baike.baidu.com/item/session/479100

时间: 2025-01-10 04:47:18

Django—Cookie and Session的相关文章

Django进阶(路由系统、中间件、缓存、Cookie和Session

路由系统 1.每个路由规则对应一个view中的函数 url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage), url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}), 2.根据app对路由规则进行一次分类 rl(r'^web/',include('web.urls')), 1.每个路由规则对应

Django之Cookie、Session、CSRF

Cookie 1.获取Cookie: 1 2 3 4 5 6 request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)     参数:         default: 默认值            salt: 加密盐         max_age: 后台控制过期时间 2.设置Cookie: 1 2 3 4 5 6 7 8 9 10 11 12 13 rep

Django的Form、CSRF、cookie和session

Django是一个大而全的web框架,为我们提供了很多实用的功能,本文主要介绍Form.CSRF.cookie和session 一.Form 在web页面中form表单是重要的组成部分,为了数据安全和减少后台服务器的压力,通常我们在前端会对form表单进行数据合法性验证,但即使这样,后台的数据验证依然是必须不可省略的,原因很简单前端数据可以被伪造或js直接被禁用. Django内置了一个强大的Form功能,帮我们快速自定义后台数据验证,它的形式非常类似model类的定义方法,并且两者也具有内在联

Django入门(八) &nbsp; cookie和session

前几节的介绍中我们已经有能力制作一个登陆页面,在验证了用户名和密码的正确性后跳转到后台的页面.但是测试后也发现,如果绕过登陆页面.直接输入后台的url地址也可以直接访问的.这个显然是不合理的.其实我们缺失的就是cookie和session配合的验证.有了这个验证过程,我们就可以实现和其他网站一样必须登录才能进入后台页面了. 先说一下这种认证的机制.每当我们使用一款浏览器访问一个登陆页面的时候,一旦我们通过了认证.服务器端就会发送一组随机唯一的字符串(假设是123abc)到浏览器端,这个被存储在浏

django的cookie和session以及内置信号、缓存

cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览器客户端的,而session是存放在服务器端的 cookie的基本操作 cookie增删改查操作 1.设置Cookies response.set_cookie("cookie_key","value") 2.获取Cookies value = request.COOK

关于django用户登录认证中的cookie和session

最近弄django的时候在用户登录这一块遇到了困难,网上的资料也都不完整或者存在缺陷. 写这篇文章的主要目的是对一些刚学django的新手朋友提供一些帮助.前提是你对django中的session和cookie已经有了一定的了解. 我最基本的设想是当用户登陆了网站后,用户访问本网站的其他网页时依旧能识别其身份. 很多教程的方法是在用户的cookie中存储用户名,这种方法当然是非常不安全的. 其实只要我们使用了django中的session,django就会自动在用户的cookie中存储 sess

Django中的cookie与session

cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来自同一人的连续请求.上图很明显的展示了Django的session与cookie的实现原理.服务器会生成两份相同的cookie字符串,一份保存在本地,一份发向求情的浏览器.浏览器将收到的cookie字符串保存下来,当下次再请求时,会将这段cookie发送到服务器,服务器得到这段cookie会与本地保

Django之cookie和session

一.cookie 保存在客户端浏览器上的键值对 1.获取cookie 1 request.COOKIES['key'] 2 request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 3 参数: 4 default: 默认值 5 salt: 加密盐 6 max_age: 后台控制过期时间 2.设置cookie 1 rep = HttpResponse(...) 或 rep = render(request,

Django中的cookie和session

cookies 客户端浏览器上的一个文件 {'user':'xiaoyanzi'} 获取cookie: request.COOKIES.get('username') 写cookie: #设置cookie,关闭浏览器失效 response = render(request,'index.html') response = redirect('/index/') response.set_cookie('key','value') return response cookies参数 #cookie