13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

创新互联Django4.0教程:Django4.0使用会话-在视图中使用会话

当激活 ​SessionMiddleware ​后,每个 ​HttpRequest ​对象(任何 Django 视图函数的第一个参数) 将得到一个 ​session ​属性,该属性是一个类字典对象。

创新互联建站是一家集网站建设,清江浦企业网站建设,清江浦品牌网站建设,网站定制,清江浦网站建设报价,网络营销,网络优化,清江浦网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

你可以在视图中任意位置读取它并写入 ​request.session​ 。你可以多次编辑它。

class backends.base.SessionBase

这是所有会话对象的基础类。它有以下标准字典方法:

它也有以下方法:

会话序列化

默认情况下,Django 序列会话数据使用 JSON 。你可以设置 ​SESSION_SERIALIZER ​来自定义会话序列化格式。即使在编写你自己的序列化程序中描述了警告,我们仍然强烈建议您坚持JSON序列化,尤其是在您使用cookie后端的情况下。
比如,如果你使用 pickle 来序列化会话数据,那么这里一个攻击场景。如果你正在使用 ​signed cookie session backend​ 并且攻击者已经知道了 ​SECRET_KEY ​(Django 并不存在会导致其泄露的固有漏洞),攻击者可以在会话里插入一个字符串,当 ​unpickled ​时,在服务器上执行任意代码。这样做的技术很简单,在互联网上也很容易获得。尽管cookie会话存储会对cookie数据进行签名防止篡改,但是泄露 ​SECRET_KEY ​会立即升级为远程代码执行的漏洞。

绑定序列化

class serializers.JSONSerializer

来自 ​django.core.signing​ 的JSON序列化器的装饰器。可以只序列化基本数据类型。
另外,因为JSON只支持字符串键,注意在 ​request.session​ 使用非字符串键会无法工作:

>>> # initial assignment
>>> request.session[0] = 'bar'
>>> # subsequent requests following serialization & deserialization
>>> # of session data
>>> request.session[0]  # KeyError
>>> request.session['0']
'bar'

同样,数据也不能在JSON中编码,例如像 ​\xd9​ 这种非UTF8字节(会引发 ​UnicodeDecodeError ​)不会被存储。

class serializers.PickleSerializer

支持任何Python对象,但是,如上所述,如果 ​SECRET_KEY ​泄露,这会导致攻击者执行远程代码的漏洞。

编写自定义的序列化器

注意这与 ​PickleSerializer ​不同,​JSONSerializer ​不会处理任何Python数据类型。通常情况下,便利性和安全性之间要做出权衡取舍。如果你想在 JSON 支持的会话里存储任何高级数据类型(比如 ​datetime ​和 ​Decimal ​),你需要编写自己的序列化器(或者在存储这类值到 ​request.session​ 之前把它们转化JSON序列化类型)。虽然序列化这些值通常很简单( ​DjangoJSONEncoder ​或许有帮助),但编写一个解码器来可靠地取回你放进去的东西就更不容易了。 例如,你要返回一个字符串格式的 ​datetime ​,但这恰好与为 ​datetime​选择的格式相同,这样会有风险。
你的序列化类必须实现两个方法( ​dumps(self, obj) ​和​ loads(self, data)​ ) 来分别进行序列化和反序列化会话数据字典。

会话对象指南

示例

这个简单的视图将一个 ​has_commented ​变量在用户评论后设置为 ​True ​。它不允许用户发表评论多于一次:

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!')

这是一个记录站点成员的简单的视图。

def login(request):
    m = Member.objects.get(username=request.POST['username'])
    if m.check_password(request.POST['password']):
        request.session['member_id'] = m.id
        return HttpResponse("You're logged in.")
    else:
        return HttpResponse("Your username and password didn't match.")

这是记录成员退出的视图:

def logout(request):
    try:
        del request.session['member_id']
    except KeyError:
        pass
    return HttpResponse("You're logged out.")

标准的 ​django.contrib.auth.logout()​ 函数实际上比这里要多一些来防止数据意外泄露。它调用 ​request.session​ 的 ​flush()​ 方法。我们使用这个例子作为示范如何使用会话对象,而不是完整的 ​logout()​ 实现。


文章名称:创新互联Django4.0教程:Django4.0使用会话-在视图中使用会话
文章位置:http://cdbrznjsb.com/article/cdhgedp.html

其他资讯

让你的专属顾问为你服务