Определяемые пользователем производные данные в Django

StackOverflow https://stackoverflow.com/questions/847201

Вопрос

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

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

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

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

Обновить

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

Это было полезно?

Решение

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

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

Если это внутреннее ("за брандмауэром"), позвольте опубликовать фрагмент кода Python и выполнить этот код.

Дайте им окружение from math import * доступная функциональность.

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

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

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

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

exec это проблема безопасности только в том случае, если вы разрешаете кому бы то ни было доступ к нему.Что касается внутренних приложений, то вы знаете пользователей.Обучайте их.

Другие советы

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

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

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

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

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

(a + c) / b 

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

a c + b / 

Который легче поддается обработке.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top