Pregunta

¿Cómo vamos a mis usuarios aplican su propia fórmula personalizada a una tabla de datos para derivar nuevos campos?

Estoy trabajando en una aplicación Django que se va a almacenar y procesar una gran cantidad de datos para los usuarios suscritos en la web abierta. Piense 100-10.000 lecturas del sensor en una solicitud de página. Voy a dibujar gráficos utilizando estos datos y que también muestra las tablas que lo contienen. Espero grupos de sensores a ser definidos por mis usuarios, que se han registrado a sí mismos en mi sitio web (es decir, que se corresponden con un modelo de Django).

Me gustaría para permitir que el usuario sea capaz de crear campos que se derivan de sus datos de sensor (como parte de un proceso de configuración). Por ejemplo, el usuario puede saber que su temperatura media es casa (temperatura sensor 1 + sensor 2 de temperatura) / 2 y quiere mostrar que en el gráfico. También puede ser que desee algo más interesante como el agua caliente calentada por el sol es (temp cabo - en temp) * * flujo constante de conversión. entonces voy a guardar estas fórmulas definidas para ellos y todos los demás que ve esta página de datos del sensor.

La pregunta principal es ¿Cómo definir la fórmula en el centro del sistema. No acabo de tener una cadena definida por el usuario para definir la fórmula (digamos 100 caracteres de largo) y analizarlo a mí mismo -? Sustituya al usuario definido con una muestra de entrada y lo llaman brindar

Actualizar

Al final llegué sólo la respuesta pedí: Una forma segura de evaluar una función de usuario almacenado en el servidor. La evaluación de la misma función también en el cliente cuando la función se está definiendo será una gran manera de hacer que la interfaz de usuario intuitiva.

¿Fue útil?

Solución

Depende de quiénes son sus clientes.

Si esto es "abierta al público" en la WWW, hay que analizar las expresiones mismo. Se puede utilizar el compilador de Python para compilar la sintaxis de Python. También puede inventar su propio compilador para un subconjunto de la sintaxis de Python. Hay un montón de ejemplos; comenzar con el capas proyecto.

Si esto es en la casa ( "detrás del firewall") deja el puesto un trozo de código Python y exec ese código.

Dales un entorno from math import * funcionalidad disponible.

Doble la siguiente alrededor de su línea suministrado de código:

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

A continuación, puede exec la definición de función y el uso de la función definida y sin cosas malas sucediendo.

Mientras que algunas personas les gusta cantar que exec es "problema de seguridad", ya no es un problema de seguridad que las contraseñas de uso compartido de usuario y administrador de hacer las cosas intencionadamente estúpidos como borrar archivos importantes o desconectar la alimentación al azar, mientras que la programación se en ejecución.

<=> es sólo un problema de seguridad si se permite a nadie el acceso a la misma. Para aplicaciones internas, ya sabes los usuarios. Entrenarlos.

Otros consejos

Me gustaría trabajar con lo que las operaciones que desea apoyar [+, -, *, /, (,), etc.] y desarrollar el lado del cliente (JavaScript) para editar y aplicar esos valores a nuevos campos de los datos. No veo la necesidad de hacer nada de esto en el servidor y el resultado final será una experiencia de usuario más sensible y agradable como consecuencia de ello.

Si usted permite al usuario guardar sus fórmulas y volver a cargarlos cuando vuelven a visitar el sitio, puede obtener su navegador para hacer todos los cálculos. Simplemente proporcione algunos métodos genéricos para agregar columnas de datos que se generan mediante la aplicación de uno de sus de forumla a sus datos.

Me imagino que el siguiente paso sería la de permitir que se aplican dichas operaciones a las columnas generadas recientemente.

¿Ha considerado la publicación de sus datos en una hoja de cálculo de Google? Esto ahorraría una gran parte del trabajo de desarrollo, puesto que ya le permiten definir fórmulas, etc., y lo aplica a los datos. No estoy muy seguro del límite de datos (cantidad de datos que puede abrir y operar sobre) le importaría.

Otro usuario hizo una pregunta similar en C. En ese poste, Warren sugirió que la fórmula se pudo analizar y convierte de

(a + c) / b 

En notación polaca inversa

a c + b / 

Lo que es más fácil de procesar.

En este caso, se podría interceptar el modelo de la fórmula de parada de generar la notación de sufijo de la fórmula definida por el usuario. Una vez que tenga la notación de sufijo, es bastante sencillo para escribir un bucle que se evalúa la fórmula de izquierda a derecha.

En cuanto a la aplicación de Django, la cuestión fundamental restante es cómo asignar diferentes campos de entrada en la fórmula. La solución simple sería un modelo que representa el campo derivado utiliza una relación de muchos a muchos con el nombre de símbolo ( "a", "b" o "c") definido per-entrada.

Si el rendimiento es realmente crítica, es posible pre-proceso de alguna manera aún más la fórmula de sufijo antes de aplicarlo a los datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top