Django cookie和session的应用场景及如何使用


Posted in Python onApril 29, 2021

为什么需要使用cookie和ses sion?

HTTP协议本身是”无状态”的,在一次请求和下一次请求之间没有任何状态保持,服务器无法识别来自同一用户的连续请求。有了cookie和session,服务器就可以利用它们记录客户端的访问状态了,这样用户就不用在每次访问不同页面都需要登录了。

什么是cookie,cookie的应用场景及缺点

cookie是一种数据存储技术, 它是将一段文本保存在客户端(浏览器或本地电脑)的一种技术,并且可以长时间的保存。当用户首次通过客户端访问服务器时,web服务器会发送给客户端的一小段信息。客户端浏览器会将这段信息以cookie形式保存在本地某个目录下的文件内。当客户端下次再发送请求时会自动将cookie也发送到服务器端,这样服务器端通过查验cookie内容就知道该客户端早访问过了。

cookie的常见应用场景包括:

  • 判断用户是否已经登录
  • 记录用户登录信息(比如用户名,上次登录时间)
  • 记录用户搜索关键词

cookie的缺点在于其并不可靠和不安全,主要原因如下:

  • 浏览器不一定会保存服务器发来的cookie,用户可以通过设置选择是否保存cookie。
  • cookie是有生命周期的(通过Expire设置),如果超过周期,cookie就会被清除。
  • HTTP数据通过明文发送,容易受到攻击,因此不能在cookie中存放敏感信息(比如信用卡号,密码等)。
  • cookie以文件形式存储在客户端,用户可以随意修改的。

Django中如何使用cookies

设置cookies(保存数据到客户端)

response.set_cookie(key,value,expires)

  • key : cookie的名称
  • value : 保存的cookie的值
  • expires : 保存的时间,以秒为单位

例子: response.set_cookie('username','John',60*60*24)

一般在Django的视图中先生成不含cookie的response,然后set_cookie, 最后把response返回给客户端(浏览器)。

下面是3个设置cookie的例子:

例子1、不使用模板

response = HttpResponse("hello world")

response.set_cookie(key,value,expires)
return response

例子2、使用模板

response = render(request,'xxx.html', context)
response.set_cookie(key,value,expires)
return response

例子3、重定向

response = HttpResponseRedirect('/login/')
response.set_cookie(key,value,expires)
return response

获取cookies,获取用户发来请求中的cookies

request.COOKIES['username']

request.COOKIES.get('username')

检查cookies是否已经存在

request.COOKIES.has_key('<cookie_name>')

删除cookies

response.delete_cookie('username')

下面是django中使用cookie验证用户是否已登录的完整代码。

# 如果登录成功,设置cookie
def login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']

            user = User.objects.filter(username__exact=username, password__exact=password)

            if user:
                response = HttpResponseRedirect('/index/')
                # 将username写入浏览器cookie,失效时间为360秒
                response.set_cookie('username', username, 3600)
                return response

            else:
                return HttpResponseRedirect('/login/')
                                                           
    else:
        form = LoginForm()

    return render(request, 'users/login.html', {'form': form})


# 通过cookie判断用户是否已登录
def index(request):
    
    #提取游览器中的cookie,如果不为空,表示为已登录帐号
    username = request.COOKIES.get('username', '')
    if not username:
        return HttpResponseRedirect('/login/')
    return render(request, 'index.html', {'username': username})

什么是session及session的工作原理

session又名会话,其功能与应用场景与cookie类似,用来存储少量的数据或信息。但由于数据存储在服务器上,而不是客户端上,所以比cookie更安全。

Session工作的流程如下:

  • 客户端向服务器发送请求时,看本地是否有cookie文件。如果有,就在HTTP的请求头(Request Headers)中,包含一行cookie信息。
  • 服务器接收到请求后,根据cookie信息,得到sessionId,根据sessionId找到对应的session,用这个session就能判断出用户是否登录等等。

使用Session的好处在于,即使用户关闭了浏览器,session仍将保持到会话过期。

Django中如何使用会话session

设置session的值

request.session['key'] = value
request.session.set_expiry(time):设置过期时间,0表示浏览器关闭则失效

获取session的值

request.session.get('key',None)

删除 session 的值

del request.session['key']

判断是否在session里

'fav_color' in request.session

获取所有session的key和value

request.session.keys()

request.session.values()

request.session.items()

settings.py 有关session的设置

1、SESSION_COOKIE_AGE = 60 * 30
2、SESSION_EXPIRE_AT_BROWSER_CLOSE = True

下面是Django中通过使用session来判断用户是否已登录的例子。

# 如果登录成功,设置session
def login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)

        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']

            user = User.objects.filter(username__exact=username, password__exact=password)

            if user:
                # 将username写入session,存入服务器
                request.session['username'] = username
                return HttpResponseRedirect('/index/')

            else:
                return HttpResponseRedirect('/login/')

    else:
        form = LoginForm()

    return render(request, 'users/login.html', {'form': form})


# 通过session判断用户是否已登录
def index(request):

    # 获取session中username
    username = request.session.get('username', '')
    if not username:
        return HttpResponseRedirect('/login/')
    return render(request, 'index.html', {'username': username})

下面是通过session控制不让用户连续评论两次的例子。实际应用中我们还可以通过session来控制用户登录时间,单位时间内连续输错密码次数等等。

from django.http import HttpResponse


def post_comment(request, new_comment):
    if request.session.get('has_commented', False):
        return HttpResponse("You've already commented.")
    c = comments.Comment(comment=new_comment)
    c.save()
    request.session['has_commented'] = True
    return HttpResponse('Thanks for your comment!')

以上就是Django cookie和session应用场景及如何使用的详细内容,更多关于Django cookie和session的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
Apr 01 Python
Python的Flask框架中实现分页功能的教程
Apr 20 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
Jul 24 Python
python中子类调用父类函数的方法示例
Aug 18 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
Sep 04 Python
Python编程flask使用页面模版的方法
Dec 28 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
如何用Python制作微信好友个性签名词云图
Jun 28 Python
python爬虫神器Pyppeteer入门及使用
Jul 13 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
Oct 28 Python
Django实现drf搜索过滤和排序过滤
Jun 21 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 #Python
python中requests库+xpath+lxml简单使用
python实现进度条的多种实现
教你如何使用Python下载B站视频的详细教程
Python+uiautomator2实现自动刷抖音视频功能
Django项目如何正确配置日志(logging)
Apr 29 #Python
django上传文件的三种方式
Apr 29 #Python
You might like
php和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
Thinkphp调用Image类生成缩略图的方法
2015/03/07 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
Javascript 类与静态类的实现(续)
2010/04/02 Javascript
将文本输入框内容加入表中的js代码
2013/08/18 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
javascript针对不确定函数的执行方法
2015/12/16 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
jQuery实现可编辑的表格
2019/12/11 jQuery
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
Django返回json数据用法示例
2016/09/18 Python
回调函数的意义以及python实现实例
2017/06/20 Python
python中强大的format函数实例详解
2018/12/05 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
Python grpc超时机制代码示例
2020/09/14 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
《会变的花树叶》教学反思
2014/02/10 职场文书
保卫科工作岗位职责
2014/03/01 职场文书
技术股份合作协议书
2014/10/05 职场文书
财产保全担保书
2015/01/20 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
班委竞选稿范文
2015/11/21 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL