2013-02-17 76 views
1

我正在運行一個Django商店,我們爲每個客戶提供一個完全獨立於所有其他客戶端圖形的對象圖。數據是中等敏感的,所以我不希望它們中的任何一個從一個客戶端泄漏到另一個客戶端,也不希望一個客戶端刪除或更改另一個客戶端的數據。安全 - 默認django ORM層---如何?

我想通過附着在安全性要求(無必要的保證),但讓我超越他們時,我知道我需要默認寫代碼來構建我的代碼,這樣我。

我主要擔心的是,在Twig.objects.get(...),我忘了添加client=request.client,同樣爲Leaf.objects.get,我必須檢查twig__client=request.client。這很快就會變得容易出錯並且很複雜。

什麼是一些好方法來解決我自己的健忘?我怎麼讓這個事情我不必考慮?

+0

自定義管理器肯定是要走的路 – joshcartme 2013-02-17 07:26:05

回答

0

一個候選解我心目中是這樣的:

  • 坐落在我的抽象基類(ES)的默認對象管理器爲DANGER = models.Manager()
  • 在適用時應用.filter(leaf__twig__branch__trunk__root__client=request.client)的所述基類上有一個方法ok(request)
  • 儘可能使用MyModel.ok(request)而不是MyModel.objects

這可以改進嗎?一個不太好的問題是視圖調用模型方法時,例如branch.get_twigs_with_fruit,我現在不得不通過一個request它運行通過ok或我必須調用DANGER。我不喜歡: - \

有什麼方法可以訪問當前請求嗎?我認爲這可能會緩解...

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

,因爲它允許的查詢要快很多,但是這是我的目的,有用又回到了你的問題,我覺得這樣的事情可能是有用的,因爲這將確保每一個客戶的數據不僅通過一個外鍵是分開的,而且實際上在db中是分開的。

除了在使用模型之前,使用這種方法是非常直接的,你必須調用函數來獲取它爲每個客戶端。爲了讓事情更有效率,可以緩存/記憶函數調用的結果,以便它不必多次重新計算同一個事物。

+0

只需檢查:你所建議的是爲每個客戶端分配一個'twig'表,然後選擇分支,中繼等,然後選擇要去哪個表動態通過你的上述代碼?我聽錯了嗎? – 2013-02-17 05:14:55

+0

是的。爲每個客戶提供不同的表格。不知道在你的情況下它是否合適,但只是一個。 – miki725 2013-02-17 05:17:15