2011-11-23 29 views
1

我試圖設計一個django應用程序的可擴展性。在模型中,我有一個Object類。我希望能夠定義對對象進行操作並根據預定義的API返回值的腳本。該計劃最終將包含數百個腳本,因此構建一個簡單的系統來管理它們是非常關鍵的。在django中,有沒有推薦的方法來存儲包含可執行的Python代碼的模型?

一些額外的功能:

  • 我需要存儲關於腳本的信息(例如,描述字段)
  • 我希望能夠使用視圖和表單這些腳本領域以最小麻煩。
  • 安全不是一個大問題 - 我會自己寫這些腳本;我只需要一個乾淨的方式來編目。

有幾種方法可以做到這一點,比如將每個腳本的可執行代碼粘貼到對象模型上,然後創建一個腳本表來保存額外的字段。但沒有一個看起來像一個很好的OOP解決方案

我正在尋找乾淨的方法來構建系統。看起來關鍵問題在於腳本的代碼應該放在哪裏。選項:在DB中,對象模型,單獨的幫助函數,外部的python腳本...

建議?

澄清

我與克里斯聊起越來越過去XY問題,在這個問題上。以下是一些有助於澄清事情的細節。

此應用程序中的大部分對象都是文本。腳本對它們進行分析 - 例如「計算文檔中的單詞數量」,或者「檢查名單中的名人是否被命名」。腳本根據指定參數傳遞和返回的API與對象進行交互。將會有很多腳本,它們將包含可執行代碼以及其他元數據。我們希望做一些事情,比如填充列出腳本及其描述的表格。

+0

聽起來像XY問題的案例示例(http: //meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你真的想做什麼? –

+0

我聽到你在說什麼,但我不認爲這是一個XY問題。我需要用一個不尋常的功能構建一個django應用程序:它將可執行代碼與「正常」模型字段相關聯。我正在尋找如何設計這種系統架構的建議。問題中的大多數其他信息可能是無關緊要的,但我想幫助人們解決問題的具體問題。關於系統架構的廣泛問題可能比具體的「幫我調試這個東西」的問題困難,但是stackoverflow有兩個空間。 – Abe

+1

這幾乎是我引用的XY問題;)。存儲可執行代碼的想法會在應用程序模型中運行在應用程序的模型中,這幾乎讓我驚恐萬分。也許這是完全合乎邏輯的理由,但我無法想到一個,也沒有提到一個。所以真正的問題是你爲什麼「需要」這樣做呢? –

回答

3

基於您與Chris聊天的潛在解決方案,我稱之爲函數註冊表。我曾經使用這種概念作爲表單構建器,其中管理員可以編寫簡單的一行驗證函數(我們使用Sympy進行處理),但有時需要來自我們必須用代碼編寫的更復雜函數的幫助。

基本上,你創建了一個你使用裝飾器綁定函數的單例類。像下面這樣:

class FunctionRegistry(object): 
    def __init__(self): 
     self.functions = [] 

    def register(self, function): 
     self.functions.append(function) 

function_registry = FunctionRegistry() 

然後,您可以編寫一個非常簡單的裝飾器函數添加到註冊表:

def registry_function(original_function): 
    function_registry.register(original_function) 
    return original_function 

有了這兩個工具,創建一個新的腳本是因爲這樣做以下簡單:

@registry_function 
def my_script(foo): 
    return process(foo) 

你可以做各種瘋狂的東西在你的函數註冊表反思 - 我的項目收集了文檔字符串和簽名,這樣用戶就可以看到說明s的所有可用功能。我在這裏簡化了註冊表,但如果有人認爲它會有用,我會很樂意提供更詳細的Django片段示例:-)

+0

這非常酷。爲了適應我的應用程序的需求,它看起來像FunctionRegistry函數對象需要被修改爲一個字典而不是一個簡單的列表。我們可以通過在裝飾器中傳遞參數來存儲函數(aka腳本)元數據。我們甚至可以使用FunctionRegistry.functions對象來限制模型CharField中的選擇參數。我開始看到潛力。美麗! – Abe

相關問題