我正在开发Web地图服务,并希望为我的用户提供可用于创建自定义插件的Python API。这些插件将在我的服务器上运行,所以我试图尽可能地锁定Python。
为了确保用户无法访问他们不应该访问的文件,我打算在PyPy沙盒解释器中运行插件。
我正在努力克服的最后一个障碍是如何克服API本身。我有一个数据库API,允许用户对数据库进行受控查询。例如,我有一个select(column,condition)
函数,允许用户从数据库中检索项目,但它们将被限制在一个表中。然后,有一个私有函数_query(sql)
,它接受原始SQL命令并在服务器上执行它们
问题在于Python(至少据我所知)没有办法阻止用户直接调用查询函数并调查我的数据库。为了防止这种情况,我想把我的API分成两部分:
------------- pipe -------------- ------------ | publicAPI | -------> | privateAPI | ---> | database | ------------- -------------- ------------
因此,publicAPI基本上是通过管道与主API通信的代理API。 publicAPI只包含公共API函数的代理,用户将无法获取私有元素(例如_query(sql)
)。
您认为这是一个可行的解决方案吗?我是否通过忽略更简单的解决方案为自己做了太多的工作?
非常感谢你的帮助!
答案 0 :(得分:2)
这看起来像是一种干净的方式来实现这一点。我相信它有时也被称为“Facade”设计模式。
在python中,使用显式方法委派(一个简短的片段给你一个大致的想法)很容易实现:
class FacadingAPI():
def __init__(fullapi_instance):
self.select = fullapi_instance.select # method delegating
...
答案 1 :(得分:0)
有很多方法可以做到这一点。我倾向于有一个包含所有可用函数名的元组,然后检查被调用的函数是否在元组中,如果没有则抛出错误。
e.g。
funcs = ("available","functions","here")
if (calledFunction in funcs):
#do something
else:
#throw error
或者您可以采用谷歌在其App Engine页面上的方法