开发者社区> 余二五> 正文

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

简介:
+关注继续查看

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 201622: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(201682584056709091, 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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
django基于python智能在线考试阅卷系统(源码+系统+mysql数据库+Lw文档)
随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的基于python的学校对在线考试阅卷系统的平台,这样可以有效地解决基于python的在线考试阅卷系统混乱的局面。本文首先介绍了基于python的在线考试系统的发展背景与发展现状,然后遵循软件常规开发流程,首先针对系统选取适用的语言和开发平台,根据需求分析制定模块并设计数据库结构,再根据系统总体功能模块的设计绘制系统的功能模块图,流程图以及E-R图。然后,设计框架并根据设计的框架编写代码以实现系统的各个功能模块。最后,对初步完成的系统进行测试,主要是
29 0
django基于python大学生心理健康系统
在各学校的教学过程中,大学生心理健康是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的可以大学生心理健康技术学习的平台,这样可以有效地解决大学生心理健康混乱的局面。本文首先介绍了大学生心理健康管理技术的发展背景与发展现状,然后遵循软件常规开发流程,首先针对系统选取适用的语言和开发平台,根据需求分析制定模块并设计数据库结构,再根据系统总体功能模块的设计绘制系统的功能模块图,流程图以及E-R图。然后,设计框架并根据设计的框架编写代码以实现系统的各个功能模块。最后,对初步完成的系统
17 0
Python基于Django的毕业设计论文选题阶段性资料管理系统
为了解决高校毕业论文原有管理方式效率低下、教师与学生之间的交流繁琐、毕业设计和论文创作过程繁杂等问题,采用基于vue和B/S模式简化了管理员、教师和学生之间的交流,细分毕业论文写作进程的部分:学生通过课题选择,在教师的审核下与教师建立关系,教师分配每一个阶段的任务,学生每进行一个阶段提交一份中期报告等待老师反馈,最后学生提交定稿论文,管理员分配并通知学生教师参加答辩。本系统界面友好,功能满足预期要求,各用户的工作效率较原有管理方式有了很大的提高
24 0
基于python(Django、Mysql)的超市管理系统的设计与实现
Python语言功能强大,可以运用在诸多方面,其中在Web开发方向也有一系列十分成功的应用,同时为了方便开发,提升开发效率出现了一系列的开发框架,其中 Django 就是一个典型的重量级选手,它帮助我们解决了开发中很多问题,比如模板、数据处理等等,这些使得我们只需要使用 Django 就可以完成大多数的开发任务。 数据库采用MySQL,它是一种关系型数据库管理系统,关系数据库将数据保存在不
54 0
运维面试题库之Python+Django
运维面试题库之Python+Django
10253 0
Django框架开发005期 Python调用template模板网页开发调用静态资源
Django框架开发005期 Python调用template模板网页开发调用静态资源
22 0
Django框架开发004期 Python编程调用自定义Django框架template模板网页
Django框架开发004期 Python编程调用自定义Django框架template模板网页
21 0
Django框架开发003期 Python+Django初步自主开发配置和分析网站项目
Django框架开发003期 Python+Django初步自主开发配置和分析网站项目
38 0
Django框架开发002期 Python编程利用PyCharm专业版和社区版开发网站
Django框架开发002期 Python编程利用PyCharm专业版和社区版开发网站
45 0
Django:用于轻松安全 Web 开发的高级 Python Web 框架
Django是一种高级 Python Web 框架,近年来在开发人员中广受欢迎。Django 专注于简单性、安全性和可扩展性,使开发人员可以轻松构建和部署强大的 Web 应用程序。在这份综合指南中,我们将仔细研究是什么让 Django 成为 Web 开发的绝佳选择,并详细探讨其主要特性和功能。
43 0
+关注
余二五
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
双剑合璧-Python和大数据计算平台的结合
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多