1

我正在经营一家 Django 商店,我们为每个客户提供一个与所有其他客户的图完全分开的对象图。数据是中等敏感的,所以我不希望其中任何一个从一个客户端泄漏到另一个客户端,也不希望一个客户端删除或更改另一个客户端的数据。

我想构建我的代码,以便我默认编写符合安全要求的代码(不需要保证),但是当我知道我需要时让我覆盖它们。

我主要担心的是Twig.objects.get(...),我忘记添加client=request.client,同样对于Leaf.objects.get我必须检查的地方twig__client=request.client。这很快变得容易出错和复杂。

有什么好方法可以解决我自己的健忘问题?我如何使这成为我不必考虑的事情?

4

2 回答 2

0

我想到的一个候选解决方案是:

  • 将默认对象管理器设置为DANGER = models.Manager()我的抽象基类。
  • ok(request)在所述基类上有一个.filter(leaf__twig__branch__trunk__root__client=request.client)适用的方法。
  • 在可行的情况下使用MyModel.ok(request)而不是。MyModel.objects

这可以改进吗?一个不太好的问题是当视图调用模型方法时,例如branch.get_twigs_with_fruit,我现在必须传递 arequest以使其运行,ok或者我必须调用DANGER. 我都不喜欢:-\

有什么方法可以访问当前请求吗?我认为这可能会缓解这种情况......

于 2013-02-17T04:39:54.787 回答
0

我会解释一个不同的问题,但我认为解决方案可能需要研究。

有一次我在做一个可视化数据的项目,我需要一个非常大的表来存储所有可视化的所有数据。结果证明这是一个大问题,因为我必须做一些Model.objects.filter(visualization=5)不太优雅且效率不高的事情。

为了让事情变得更简单、更高效,我最终动态创建了动态模型。本质上,我会动态地在数据库中创建一个单独的表,然后只在其中存储一个可视化的数据。我的代码是这样的:

def get_model_class(table_name):
    class ModelBase(ModelBase):
        def __new__(cls, name, bases, attrs):
            name = '{}_{}'.format(name, table_name)
            return super(ModelBase, cls).__new__(cls, name, bases, attrs)


    class Data(models.Model):
        # fields here
        __metaclass__ = ModelBase
        class Meta(object):
            db_table = table_name

    return Data

dynamic_model = get_model_class('foo')

这对我的目的很有用,因为它允许查询更快,但回到你的问题我认为这样的事情可能很有用,因为这将确保每个客户端的数据不仅通过外键分开,而且实际上是分开的在数据库中。

使用此方法非常简单,除非在使用模型之前,您必须调用该函数来为每个客户端获取它。为了使事情更高效,您可以缓存/记忆函数调用的结果,这样它就不必多次重新计算同一事物。

于 2013-02-17T05:08:46.403 回答