1

私は、他のすべてのクライアントのグラフとは完全に分離されたオブジェクト グラフを各クライアントに提供する Django ショップを運営しています。データは適度に機密であるため、あるクライアントから別のクライアントに漏洩したり、あるクライアントが別のクライアントのデータを削除または変更したりしたくありません。

デフォルトでセキュリティ要件に準拠するコードを記述し (厳密な保証は必要ありません)、必要に応じてオーバーライドできるようにコードを構成したいと考えています。

私の主な恐れは、 aに を追加するのをTwig.objects.get(...)忘れていることです。これはすぐにエラーが発生しやすく、複雑になります。client=request.clientLeaf.objects.gettwig__client=request.client

自分の物忘れを回避する良い方法は何ですか? これを考えなくて済むようにするにはどうすればよいでしょうか。

4

2 に答える 2

0

私が念頭に置いている1つの候補ソリューションは次のとおりです。

  • デフォルトのオブジェクト マネージャをDANGER = models.Manager()抽象基本クラスに設定します。
  • ok(request)該当する場合に適用される上記の基本クラスのメソッドを用意.filter(leaf__twig__branch__trunk__root__client=request.client)します。
  • MyModel.ok(request)可能な場合は代わりに使用しMyModel.objectsてください。

これは改善できますか?あまり良くない問題の 1 つは、ビューがモデル メソッドを呼び出す場合です。たとえば、を実行するために をbranch.get_twigs_with_fruit渡すか、を呼び出す必要があります。どちらも好きじゃない:-\requestokDANGER

現在のリクエストにアクセスする方法はありますか? 状況を緩和できると思います...

于 2013-02-17T04:39:54.787 に答える
0

私が抱えていた別の問題について説明しますが、解決策は検討する必要があると思います。

以前、データを視覚化するプロジェクトに取り組んでいたときに、すべての視覚化のすべてのデータを格納する非常に大きなテーブルが必要でした。それは大きな問題であることが判明しました。なぜなら、Model.objects.filter(visualization=5)あまりエレガントでも効率的でもないようなことをしなければならなかったからです。

物事をよりシンプルかつ効率的にするために、動的モデルをその場で作成することになりました。基本的に、その場で db に別のテーブルを作成し、その 1 つの視覚化のデータのみを格納します。私のコードは次のようなものです:

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 に答える