博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
8Python全栈之路系列之Django Cookie 与Sessi
阅读量:6899 次
发布时间:2019-06-27

本文共 6273 字,大约阅读时间需要 20 分钟。

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 HH:MM:SS 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配置文件,修改配置如下:

  1. 找到MIDDLEWARE段,确保列表里有‘django.contrib.sessions.middleware.SessionMiddleware’,字段

  2. 找到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_REQUESTTrue来改变这一缺省行为,如果置为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

本文转自 Edenwy  51CTO博客,原文链接:http://blog.51cto.com/edeny/1925103,如需转载请自行联系原作者
你可能感兴趣的文章
引体向上高级技巧:停顿式引体向上!
查看>>
C++ 友元类使用 (friend)
查看>>
C#中重写(override)和覆盖(new)的区别
查看>>
Jackson的用法实例分析
查看>>
ios webview下纯JS实现长按
查看>>
数字证书简介及Java编码实现
查看>>
Haproxy安装与配置
查看>>
SSH登录启用Google二次身份验证
查看>>
设置java.library.path的值(Mac/Linux/Windows)
查看>>
旅游准备清单
查看>>
WPF圆角按钮与触发颜色变化
查看>>
m_Orchestrate learning system---十六、如何快速在一堆字符图标中找到所需
查看>>
Python GUI
查看>>
038 lock wait timeout exceeded;try restarting transaction
查看>>
idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到
查看>>
Java IO流学习总结
查看>>
Java 枚举(enum) 的常见用法和开发规范
查看>>
jar命令+7z:创建,替换,修改,删除Jar, war, ear包中的文件
查看>>
金融蝴蝶效应
查看>>
.Net Excel 导出图表Demo(柱状图,多标签页) .net工具类 分享一个简单的随机分红包的实现方式...
查看>>