本文共 6273 字,大约阅读时间需要 20 分钟。
cookies
是浏览器为Web服务器存储的一小段信息,每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies
.
创建Cookies
1 2 3 4 5 6 7 8 | def set_cookie(request): # 创建HttpResponse对象 Response = HttpResponse() # 创建cookie Response.set_cookie( "CookieKey" , "CookieValue" ) # 删除cookie # Response.delete_cookie("CookieKey") return Response |
获取Cookies
1 2 3 4 5 6 7 8 9 10 | def show_cookie(request): # 如果cookie存在 if "CookieKey" in request.COOKIES: # cookie的值并赋值给VAL VAL = request.COOKIES[ "CookieKey" ] # 如果不存在 else : # VAL=Cookie不存在 VAL = "Cookie不存在" return HttpResponse(VAL) |
测试Cookies
Django提供了一个简单的方法来测试用户的浏览器是否接受cookie:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # urls.py from django.conf.urls import url from django.contrib import admin from DjangoProjects import views urlpatterns = [ url(r '^admin/' , admin.site.urls), url(r '^test_cookie/' , views.test_cookie), url(r '^hello/' , views.hello), ] # views.py from django.http import HttpResponse def test_cookie(request): # 植入测试的cookie request.session.set_test_cookie() return HttpResponse( "a" ) def hello(request): # 获取测试的cookie ret = request.session.test_cookie_worked() print (ret) if ret: VAL = "验证成功" # 删除测试的cookie request.session.delete_test_cookie() else : VAL = "验证失败" return HttpResponse(VAL) |
创建Cookies时的参数
参数 | 默认值 | 描述 |
---|---|---|
max_age | None | cookie生存时间,如果参数是None,这个cookie会延续到浏览器关闭为止 |
expires | None | cookie失效的实际日期/时间,格式必须是:Wdy, DD-Mth-YY HHSS GMT ,这个参数会覆盖max_age参数 |
path | "/" | cookie生效的路径前缀 |
domain | None | 这个cookie在那个站点生效,如果为None ,就是当前站点,如果设为domain=".example.com" ,则所有带example.com 的二级域名站点都可读到cookie |
False | False | 如果设置为True,浏览器将通过HTTPS来回传cookie |
你可以用session框架来存取每个访问者任意数据,这些数据在服务器端存储,并对cookie的收发进行了抽象,Cookies只存储数据的哈希会话ID,而不是数据本身,从而避免了大部分的常见cookie问题。
编辑settings.py配置文件,修改配置如下:
找到MIDDLEWARE
段,确保列表里有‘django.contrib.sessions.middleware.SessionMiddleware’,字段
找到INSTALLED_APPS
段,确保列表里有‘django.contrib.sessions’,字段
编辑settings.py配置文件,找到DATABASES字段进行数据库的配置:
1 2 3 4 5 6 7 8 9 10 | DATABASES = { 'default' : { 'ENGINE' : 'django.db.backends.mysql' , 'NAME' : 'mydatabase' , 'USER' : 'root' , 'PASSWORD' : 'as' , 'HOST' : '127.0.0.1' , 'PORT' : '3306' , } } |
然后再项目的__init__.py
文件加入以下两行配置:
1 2 | import pymysql pymysql.install_as_MySQLdb() |
生成数据表
1 | E:\DjangoProjects>python manage.py migrate |
SessionMiddleware
激活后,每个传给视图(view)函数的第一个参数HttpRequest
对象都有一个session
属性,这是一个字典型的对象,你可以象用普通字典一样来用它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from django.http import HttpResponse def set_session(request): # 设置一个session request.session[ "SessionKey" ] = "SessionValue" # 返回页面一个字符串 return HttpResponse( "session" ) def show_session(request): # 判断session是否存在 if "SessionKey" in request.session: # 获取session的值 ret = request.session[ "SessionKey" ] # 删除session del request.session[ "SessionKey" ] else : ret = None return HttpResponse(ret) |
其他的映射方法,如keys()和items()对request.session同样有效。
session的数据存放在django_session表内
1 2 3 4 5 6 7 8 9 | mysql> use mydatabase Database changed mysql> select * from django_session; + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | session_key | session_data | expire_date | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | bvthtagcl257hiv8v2wfqnf03m5268sg | ZjY4ZGM1MzRiZGExOGNhMjI0ODBlMjZjM2JhYjU5ODU2MzU5MjM1Mzp7IjAiOjAsIjEiOjEsIjIiOjIsIjMiOjMsIjQiOjQsIjUiOjUsIjYiOjYsIjciOjcsIjgiOjgsIjkiOjl9 | 2016 - 08 - 25 08 : 33 : 31.281157 | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 1 row in set ( 0.00 sec) |
进入带django
环境变量的Python解释器
1 2 3 4 5 | E:\DjangoProjects>python manage.py shell Python 3.5 . 2 (v3. 5.2 : 4def2a2901a5 , Jun 25 2016 , 22 : 18 : 55 ) [MSC v. 1900 64 bit (AMD64)] on win32 Type "help" , "copyright" , "credits" or "license" for more information. (InteractiveConsole) >>> |
1 2 3 4 5 6 7 8 9 10 11 | >>> from django.contrib.sessions.models import Session # pk后面的字符是从django_session表内获取的session_key >>> s = Session.objects.get(pk = 'bvthtagcl257hiv8v2wfqnf03m5268sg' ) >>> s.expire_date datetime.datetime( 2016 , 8 , 25 , 8 , 40 , 56 , 709091 , tzinfo = <UTC>) # 这是经过加密的数据 >>> s.session_data 'NjdiZGYyODljOTNlMTQ3NmFjZTc0YzRlMmVjNmExYTc1NjZkNzUzNDp7IjAiOjAsIjMiOjMsIjkiOjksIjQiOjQsIjEiOjEsIjciOjcsIjIiOjIsIjYiOjYsIjUiOjUsIjgiOjh9' # 使用get_decoded()来读取实际的session数据 >>> s.get_decoded() { '8' : 8 , '9' : 9 , '2' : 2 , '5' : 5 , '1' : 1 , '6' : 6 , '4' : 4 , '7' : 7 , '3' : 3 , '0' : 0 } |
默认情况下,session只会在发生变化的时候才会存入数据库,比如说,字典赋值或删除,你可以设置SESSION_SAVE_EVERY_REQUEST
为True
来改变这一缺省行为,如果置为True的话,会话cookie在每次请求的时候都会送出,同时,每次会话cookie送出的时候,其expires
参数都会更新。
SESSION_EXPIRE_AT_BROWSER_CLOSE
如果cookie没有设置过期时间,当用户关闭浏览器的时候,cookie就自动过期了,你可以改变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_COOKIE_DOMAIN
使用会话cookie(session cookies)的站点,将它设成一个字符串,就好象“.example.com”
以用于跨站点(cross-domain)的cookie,或None
以用于单个站点,默认为None
SESSION_COOKIE_NAME
会话中使用的cookie的名字。 它可以是任意的字符串。默认为sessionid
SESSION_COOKIE_SECURE
是否在session中使用安全cookie,如果设置True , cookie就会标记为安全,这意味着cookie只会通过HTTPS来传输,默认为False