8Python全栈之路系列之Django Cookie 与Sessi

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

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,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
监控 安全 应用服务中间件
python中Django入门(四)
python中Django入门(四)
31 0
|
16天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
8天前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
15天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
|
23天前
|
前端开发 测试技术 数据库
【python】为什么使用python Django开发网站这么火?
【python】为什么使用python Django开发网站这么火?
|
1月前
|
Python
老男孩&路飞学城Python全栈
老男孩&路飞学城的Python全栈开发重点班由ALEX老师主讲,核心教学内容,100多天课程,近100G资料,含基础到实战。一线技术专家亲授,以案例教学引导学生逐步进入项目实战。
20 1
老男孩&路飞学城Python全栈
|
1月前
|
中间件 数据安全/隐私保护 Python
python中Django入门(三)
python中Django入门(三)
17 0
|
1月前
|
前端开发 JavaScript Shell
python中Django入门(二)
python中Django入门(二)
13 0
|
1月前
|
SQL Shell 数据库
python中Django入门(一)
python中Django入门(一)
28 0
|
1月前
|
设计模式 前端开发 数据库
Django是一个用Python编写的开源Web应用框架
Django是一个用Python编写的开源Web应用框架
13 1