Django开发——会话

Cookies

cookies是浏览器为Web服务器存储的一小段信息。每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies。它为了解决HTTP的无状态而产生。

工作原理

当你打开浏览器并访问google.com,你的浏览器会给Google发送一个HTTP请求:

GET / HTTP/1.1
Host: google.com
...

当Google响应时,HTTP的响应时这样的:

HTTP/1.1 200 OK
Content‐Type: text/html
Set‐Cookie: PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671;
expires=Sun, 17‐Jan‐2038 19:14:07 GMT;
path=/; domain=.google.com
Server: GWS/2.1
...

你的浏览器会存储cookie值(PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671)这个是会话的ID而不是数据本身。而且每次访问google站点都会回送这个cookie值。因此当你下次访问Google时,你的浏览器会发送这样的请求:

GET / HTTP/1.1
Host: google.com
Cookie: PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671

于是Cookies的值到苏Google,你以前访问过这个网站,这个值可能是数据库中存储用户信息的key,可以用它在页面上显示你的用户名。Google会使用它在网页上显示你账号的用户名。

如何使用会话

Django提供对匿名会话的完全支持。这个会话框架让你可以存储和取回每个站点访问任意数据。他在苏武器端存储数据,并以cookies的形式进行发送和接收数据。
启用会话

编辑MIDDLEWARE设置,并确保它包含’django.contrib.sessions.middleware.SessionMiddleware’使用django-admin startproject创建的默认时开启的,如果想关闭会话功能那么就移除它,另外移除INSTALLED_APPS中的 'django.contrib.sessions’配置。
配置会话引擎
默认情况下,Django存储会话到数据库中,虽然这很方便,但在眸子鳄架构中存储会话在其他地方会更快,所以可以配置Django来存储会话到文件系统或缓存中。INSTALLED_APPS中的 'django.contrib.sessions’配置。表示数据库支持。

存取Cookies
每一个HttpRequest对象都有一个COOKIES对象,该对象的行为类似一个字典,你可以使用它读取任何浏览器发送给视图的cookies。

def show_color(request):

    if 'favorite_color' in request.COOKIES:
        return HttpResponse("Your favorite color is %s" %(request.COOKIES['favorite_color']))
    else:
        return HttpResponse("You don't have a favorite color")


#设置cookie
def set_color(request):

    if "favorite_color" not in request.GET:
        #创建一个HttpResponse对象
        response=HttpResponse("Your favorite color is now %s" %(request.GET["favorite_color"]))

        #在响应上设置cookie
        response.set_cookie("favorite_color",request.GET["favorite_color"])

        return response

    else:
        return HttpResponse("You didn't give a favorite color.")

可以给response.set_cookie()传递一些可选的参数来控制cookie的行为。
|参数|缺省值|描述|
|-|-|
|max_age|None|cookie需要延续的时间(以秒计),如果设置为None,在浏览器关闭的时候就失效了|
|expires|None|cookies的过期时间,如果设置这个时间,它将覆盖max_age的值|
|path|’/’|cookie生效的路径前缀,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点用的其他应用。当你不处于站点顶层的时候,这个参数很有用|
|damain|cookie生效的站点。可用这个参数来构造一个跨站cookie,如果设置为None,cookie只能由设置它的站点读取。
|secure|False|如果设置为True,浏览器将通过HTTPS来回传cookie|
注意:不能再cookies中存储敏感数据,因为容易被拦截,修改。

Django的Session框架

Django中自带的session框架会帮你解决存在的限制与安全漏洞这些让人头疼的问题。
你可以使用session框架来存取每个访问者任意数据,这些数据在服务端存储,并对cookie的收发进行了抽象。Cookies只存储哈希会话的ID,而不是数据本身。
打开sessions功能
Sessions 功能是通过一个中间件和一个模型来实现的。打开session的步骤:

  • 编辑MIDDLEWARE配置,确保里面含有’django.contrib.sessions.middleware.SessionMiddleware’
  • 确认INSTALLED_APPS中含有’django.contrib.sessions’

在视图中使用Session
SessionMiddleware激活后,每个传给视图函数的第一个参数HttRequest对象都有一个session属性,这是一个字典型的对象。

# 设置一个session的值
request.session["fav_color"]="blue"

#获取
fav_color=request.session["fav_color"]

# 删除
del request.session["fav_color"]

# 检查
if "fav_color" in request.session:

一个简单的站点登录视图

def login(request):
if request.method != 'POST':
raise Http404('Only POSTs are allowed')
try:
m = Member.objects.get(username=request.POST['username'])
if m.password == request.POST['password']:

#将id存入会话中
request.session['member_id'] = m.id
return HttpResponseRedirect('/you‐are‐logged‐in/')
except Member.DoesNotExist:
return HttpResponse("Your username and password didn't match.")

登出

def logout(request):
try:
#删除会话中的用户信息
del request.session['member_id']
except KeyError:
pass
return HttpResponse("You're logged out.")

设置测试Cookies
判断浏览器是否可以接受cookie

  • 在视图中调用request.session.set_test_cookie()来设置一个cookie
  • 在后续的视图中调用request.session.test_cookie_worked()来检测。
  • 检测完后,用delete_test_cookie()来清除它。
    在视图外使用Session
    从内部来看,每个session都只是一个普通的Django model。每个session都由一个随机的32字节哈希串标识,并存储于cookie中。他是一个标准的模型,所以可以使用Django数据库来存取。
>>> from django.contrib.sessions.models import Session
>>> s = Session.objects.get(pk='2b1189a188b44ad18c35e113ac6ceead')
>>> s.expire_date
datetime.datetime(2005, 8, 20, 13, 35, 12)

需要使用 get_decoded() 来读取实际的session数据

>>> s.session_data
'KGRwMQpTJ19hdXRoX3VzZXJfaWQnCnAyCkkxCnMuMTExY2ZjODI2Yj...'
>>> s.get_decoded()
{'user_id': 42}

何时保存Session
缺省的情况下,Django只会在session发生变化的时候才会存入数据库。比如字典的赋值和删除。
你可以设置SESSION_SAVE_EVERY_REQUEST为True来改变这个行为。如果为True,Django会在每次受到请求时保存session/
注意,会话cookie只会在创建和修改的时候才会送出。 但如果 SESSION_SAVE_EVERY_REQUEST 设置为 True ,会话cookie在每次请求的时候都会送出。 同时,每次会话cookie送出的时候,其 expires 参数都会更新。
浏览器关闭即失效会话VS持久会话
你可以改变 SESSION_EXPIRE_AT_BROWSER_CLOSE 的设置来控制session框架的这一行为。
缺省情况下, SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 False ,这样,会话cookie可以在用户浏览器中保持
有效达 SESSION_COOKIE_AGE 秒(缺省设置是两周,即1,209,600 秒)。 如果你不想用户每次打开浏览器都必须
重新登陆的话,用这个参数来帮你。
如果 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 True ,当浏览器关闭时,Django会使cookie失效。
技术细节

  • session字典接收任何序列化的python对象。
  • Session数据存在数据库表django_session中
  • Session数据在需要时才会读取,如故你不使用request.session,Django不会动相关数据库表。
  • Django只在需要的时候才送出cookie。如果你没有设置任何会话的数据,它不会送出会话,除非SESSION_SAVE_EVERY_REQUEST 设置为 True。
  • Django session 框架完全而且只能基于cookie。它不会后退到把会话ID编码在URL中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值