如何使用django在会话中创建对象的实例?

时间:2016-09-08 12:12:46

标签: python django session

我有一个对象模型,必须在客户端用户给出的每个答案上调用。但问题是每当用户点击答案时,我的视图就会运行,对象会再次初始化,而不应该。所以我想在另一个单独的视图中在会话中创建对象实例,并在任何视图中一次又一次地重复使用相同的实例。

但它让我觉得这个:

public class EpisodeModel
{
    [Key]
    public int Id { get; set; }
    public string Title { get; set; }

    public virtual EpisodePatientModel EpisodePatient { get; set; }
}

public class EpisodePatientModel
{
    public string Name { get; set; }

    [Key, ForeignKey("Episode")]
    public int EpisodeId { get; set; }
    public virtual EpisodeModel Episode { get; set; }
}

enter image description here

我需要有关如何使用django在会话中创建实例的帮助。

1 个答案:

答案 0 :(得分:1)

django中的会话不存储在服务器内存中,因此它们不能包含纯对象。它们被序列化为字符串,可以存储在一些存储后端(数据库,缓存,用户cookie等)中。

默认情况下,django使用JSON序列化程序进行会话。 JSON Serializer无法对对象进行序列化。

django内置了另一个序列化程序:pickle。它几乎可以序列化你在python中创建的任何东西,但它有一些缺点。它速度较慢,并且与任何不受信任的会话存储(例如cookie)一起使用时,它可能会成为非常严重的安全漏洞,因为它会允许攻击者运行任何代码,只需交换序列化数据。有关详细信息,请参阅Django docs

此外,反序列化的pickle将尝试从序列化时重新创建对象状态。这个对象不会被保留在内存中,所以考虑从pickle反序列化它是否比从头重新创建它更好(就像你之前做过的那样)。