Пользовательские производные данные в Django - PullRequest
2 голосов
/ 11 мая 2009

Как я могу позволить своим пользователям применять свои собственные формулы к таблице данных для получения новых полей?

Я работаю над приложением Django , которое собирается хранить и обрабатывать большое количество данных для подписанных пользователей в открытой сети. Подумайте, 100-10 000 показаний датчика в одной странице запроса. Я собираюсь рисовать графики, используя эти данные, а также таблицы, содержащие их. Я ожидаю, что группы датчиков будут определены моими пользователями, которые зарегистрируются на моем веб-сайте (т.е. они соответствуют модели django).

Я хотел бы позволить пользователю иметь возможность создавать поля, которые получаются из данных его датчиков (как часть процесса настройки). Например, пользователь может знать, что его средняя температура в доме (датчик температуры 1 + датчик температуры 2) / 2, и хочет показать это на графике. Они могут также захотеть что-то более интересное, например, солнечная горячая вода с подогревом (постоянная температура) - постоянная конверсии потока *. Затем я сохраню эти определенные формулы для них и всех, кто просматривает эту страницу данных датчика.

Главный вопрос - как мне определить формулу в центре системы? У меня просто есть пользовательская строка для определения формулы (скажем, длиной в 100 символов) и ее синтаксического анализа - заменить пользователя, определенного входным образцом, и вызвать его как тост?

Обновление

В итоге я получил только один ответ, который я просил: безопасный способ оценки сохраненной пользовательской функции на сервере. Оценка той же функции на клиенте во время ее определения станет отличным способом сделать интерфейс интуитивно понятным.

Ответы [ 3 ]

2 голосов
/ 11 мая 2009

Я бы определил, какие операции вы хотите поддерживать [+, -, *, /, (,) и т. Д.), И разработал бы клиентскую часть (javascript) для редактирования и применения этих значений к новым полям данных. Я не вижу необходимости делать что-либо из этого на стороне сервера, и в результате вы получите более отзывчивый и приятный пользовательский опыт.

Если вы разрешите пользователю сохранять свои формулы и повторно загружать их при повторном посещении сайта, вы можете заставить его браузер выполнять все вычисления. Просто предоставьте несколько общих методов для добавления столбцов данных, которые генерируются путем применения одного из их форумов к вашим данным.

Я полагаю, что следующим шагом будет позволить им применить эти операции к вновь сгенерированным столбцам.

Рассматривали ли вы размещение их данных в электронной таблице Google? Это сэкономит большую часть работы по разработке, поскольку она уже позволяет вам определять формулы и т. Д. И применять их к данным. Я не слишком уверен в пределе данных (сколько данных вы можете публиковать и обрабатывать), обратите внимание.

2 голосов
/ 11 мая 2009

Зависит от того, кто ваши клиенты.

Если это "открыто для публики" на WWW, вы должны проанализировать выражения самостоятельно. Вы можете использовать компилятор Python для компиляции синтаксиса Python. Вы также можете изобрести свой собственный компилятор для подмножества синтаксиса Python. Есть много примеров; начать с проекта ply .

Если это внутри компании («за брандмауэром»), пусть постит кусок кода Python и исполняет этот код.

Предоставьте им среду from math import * функциональность доступна.

Сложите следующую строку вокруг предоставленной строки кода:

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

Затем вы можете выполнить определение функции и использовать определенную функцию без каких-либо неприятностей.

В то время как некоторые люди любят кричать, что exec - это «проблема безопасности», это не больше проблема безопасности, чем обмен паролями пользователя, и администратор делает намеренно глупые вещи, такие как удаление важных файлов или случайное отключение питания во время программирования работает.

exec является проблемой безопасности, только если вы разрешаете кому-либо доступ к ней. Для внутренних приложений вы знаете пользователей. Тренируйте их.

0 голосов
/ 11 мая 2009

Другой пользователь задал аналогичный вопрос на C. В этом посте Уоррен предположил, что формула может быть проанализирована и преобразована из

(a + c) / b 

В обратная польская запись

a c + b / 

Что легче обрабатывать.

В этом случае вы можете перехватить сохранение модели формулы и сгенерировать нотацию постфикса из определяемой пользователем формулы. Если у вас есть постфиксная запись, написать цикл, который оценивает формулу слева направо, довольно просто.

Что касается реализации в Django, основной вопрос остается в том, как отобразить различные поля ввода в формулу. Простое решение - модель, представляющая производное поле, использует отношение «многие ко многим» с именем символа («a», «b» или «c»), определенным для каждого входа.

Если производительность действительно критична, вы можете каким-то образом предварительно обработать формулу постфикса перед ее применением к данным.

...