2009-11-03 35 views
0

我正在研究Web地圖服務,並希望爲我的用戶提供一個可用於創建自定義插件的Python API。這些插件將在我的服務器上運行,所以我試圖儘可能鎖定Python。在Python中使用私有元素的公共API

爲了確保用戶無法訪問他們不應該訪問的文件,我計劃在PyPy沙盒解釋器中運行插件。

我試圖克服的最後一個大障礙是如何克服API本身。我有一個數據庫API,允許用戶對數據庫進行受控查詢。例如,我有一個select(column,condition)函數,它允許用戶從數據庫中檢索項目,但它們將被限制在一個表格中。然後,有一個私人函數_query(sql)需要原始的SQL命令,並在服務器上執行它們

問題是,Python(至少據我所知)沒有提供防止用戶直接調用查詢函數和nuking我的方法數據庫。爲了防止這種情況,我想打破我的API分爲兩個部分:

 
------------- pipe --------------  ------------ 
| publicAPI | -------> | privateAPI | ---> | database | 
-------------   --------------  ------------ 

所以publicAPI將基本上是一個代理API通過管道的主要API通信。 publicAPI只包含公共API函數的代理,用戶將無法獲得私有元素(如_query(sql))。

您認爲這是一個可行的解決方案嗎?忽略更簡單的解決方案,我是否爲自己做了太多工作?

非常感謝您的幫助!

回答

2

這看起來像一個乾淨的方式來實現這一點給我。我相信它有時也被稱爲「立面」設計模式。

在Python中,這是非常容易使用顯式方法代表團(其中一小段給你一個總體思路)來實現:

class FacadingAPI(): 
    def __init__(fullapi_instance): 
     self.select = fullapi_instance.select # method delegating 
     ... 
0

有很多方法,你可以做到這一點。我傾向於有一個所有可用的函數名稱的元組,然後檢查被調用的函數是否在元組中,如果沒有則拋出錯誤。

例如

funcs = ("available","functions","here") 

if (calledFunction in funcs): 
    #do something 
else: 
    #throw error 

,或者你可以採取的辦法,谷歌有自己的App Engine的頁面

http://code.google.com/appengine/articles/rpc.html