Python全栈之路系列之Django Cookie与Sessi
Cookies
cookies
是浏览器为Web服务器存储的一小段信息,每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies
.
存取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
你可以用session框架来存取每个访问者任意数据,这些数据在服务器端存储,并对cookie的收发进行了抽象,Cookies只存储数据的哈希会话ID,而不是数据本身,从而避免了大部分的常见cookie问题。
开启Django内的Session功能
编辑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
|
在视图内使用Session
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)
|
在视图外使用Session
进入带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
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