2

如何让我的用户将自己的自定义公式应用于数据表以派生新字段?

我正在开发一个Django应用程序,它将为开放网络上的订阅用户存储和处理大量数据。在一页请求中考虑 100-10,000 个传感器读数。我将使用这些数据绘制图表并显示包含它的表格。我希望我的用户定义传感器组,他们将在我的网站上注册自己(即它们对应于 django 模型)。

我想让用户能够创建从他们的传感器数据派生的字段(作为设置过程的一部分)。例如,用户可能知道他们的平均房屋温度为 (温度传感器 1 + 温度传感器 2) / 2,并希望将其显示在图表上。他们可能还想要一些更有趣的东西,比如太阳能热水加热是(温度输出 - 温度输入)* 流量 * 转换常数。然后,我将为他们以及查看此传感器数据页面的其他所有人保存这些定义的公式。

主要问题是如何定义系统中心的公式。我是否只有一个用户定义的字符串来定义公式(比如 100 个字符长)并自己解析它 - 用输入样本替换用户定义并将其命名为 toast?

更新

最后,我得到了我想要的答案:一种评估服务器上存储的用户功能的安全方法。在定义函数时也在客户端上评估相同的函数将是使 UI 直观的好方法。

4

3 回答 3

2

我会计算出您想要支持哪些操作 [+,-,*,/,(,),etc] 并开发客户端 (javascript) 来编辑这些值并将其应用于数据的新字段。我认为不需要在服务器端做任何事情,因此您最终将获得响应更快、更愉快的用户体验。

如果您允许用户保存他们的公式并在他们重新访问该站点时重新加载它们,您可以让他们的浏览器进行所有计算。只需提供一些通用方法来添加通过将其论坛之一应用于您的数据而生成的数据列。

我想下一步是允许他们将这些操作应用于新生成的列。

您是否考虑过将他们的数据发布到谷歌电子表格中?这将节省大量开发工作,因为它们已经允许您定义公式等并将其应用于数据。我不太确定数据限制(您可以发布和操作多少数据)请注意。

于 2009-05-11T09:44:18.933 回答
2

取决于你的客户是谁。

如果这是在 WWW 上“对公众开放”,您必须自己解析表达式。您可以使用 Python 编译器来编译 Python 语法。您还可以为 Python 语法的子集发明自己的编译器。有很多例子;从ply项目开始。

如果这是内部的(“在防火墙后面”),请发布一段 Python 代码并执行该代码。

为他们提供可用的环境from math import *功能。

围绕他们提供的代码行折叠以下内容:

def userFunc( col1, col2, col3, ... ):
   result1= {{ their code goes here }}
   return result1

然后您可以执行函数定义并使用定义的函数而不会发生坏事。

虽然有些人喜欢吹嘘这exec是“安全问题”,但这并不比用户共享密码更安全问题,而且管理员会故意做一些愚蠢的事情,比如在你的程序运行时删除重要文件或随机关闭电源。

exec如果您允许任何人访问它,这只是一个安全问题。对于内部应用程序,您了解用户。训练他们。

于 2009-05-11T10:41:43.723 回答
0

另一位用户在 C 语言中提出了类似的问题。在那篇文章中,Warren 建议可以从

(a + c) / b 

进入逆波兰符号

a c + b / 

哪个更容易处理。

在这种情况下,您可以截取公式模型的保存并从用户定义的公式生成后缀符号。一旦你有了后缀符号,编写一个从左到右计算公式的循环就相当简单了。

至于在 Django 中的实现,剩下的核心问题是如何将不同的输入字段映射到公式中。简单的解决方案是表示派生字段的模型使用与每个输入定义的符号名称(“a”、“b”或“c”)的多对多关系。

如果性能真的很关键,您可能会在将后缀公式应用于数据之前以某种方式进一步预处理它。

于 2009-05-11T08:41:14.077 回答