2

ユーザーが独自のカスタム数式をデータ テーブルに適用して新しいフィールドを取得できるようにするにはどうすればよいですか?

私は、オープン Web 上の購読ユーザーのために大量のデータを保存および処理するDjangoアプリケーションに取り組んでいます。1 ページのリクエストで 100 ~ 10,000 のセンサー読み取り値を考えてください。このデータを使用してグラフを描画し、それを含む表も表示します。センサーのグループは、私の Web サイトに登録しているユーザーによって定義されることを期待しています (つまり、django モデルに対応しています)。

ユーザーがセンサー データから派生したフィールドを作成できるようにしたいと考えています (セットアップ プロセスの一部として)。たとえば、ユーザーは家屋の平均温度が (温度センサー 1 + 温度センサー 2) / 2 であることを知っており、それをグラフに表示したいとします。彼らはまた、加熱された太陽熱温水が (温度出力 - 温度入力) * 流量 * 変換定数であるなど、もっと興味深いものを望むか​​もしれません。次に、これらの定義済みの式を保存し、このページのセンサー データを表示する他のすべての人のために保存します。

主な問題は、システムの中心にある式をどのように定義するかです。数式を定義するためのユーザー定義の文字列 (たとえば 100 文字の長さ) を持っていて、それを自分で解析する必要がありますか? ユーザー定義を入力サンプルに置き換えて、それをトーストと呼びますか?

アップデート

最終的に、私が求めていた答えが得られました: サーバーに格納されたユーザー関数を評価する安全な方法。関数が定義されているときにクライアントでも同じ関数を評価することは、UI を直感的にするための優れた方法です。

4

3 に答える 3

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 に答える
2

[+、-、*、/、(、)、など] をサポートする操作を検討し、クライアント側 (javascript) を開発して、それらの値を編集し、データの新しいフィールドに適用します。このサーバー側で何かを行う必要はないと思います。その結果、応答性が高く楽しいユーザー エクスペリエンスが実現します。

ユーザーが数式を保存し、サイトに再度アクセスしたときに再読み込みできるようにすると、ブラウザーにすべての計算を実行させることができます。フォーラムの1つをデータに適用することによって生成されるデータの列を追加するための一般的な方法をいくつか提供するだけです。

次のステップは、それらの操作を新しく生成された列に適用できるようにすることだと思います。

データを Google スプレッドシートに投稿することを検討しましたか? これにより、式などを定義してデータに適用できるようになるため、多くの開発作業が節約されます。データ制限 (投稿して操作できるデータの量) についてはよくわかりません。

于 2009-05-11T09:44:18.933 に答える
0

別のユーザーが C で同様の質問をしました。その投稿で、ウォーレンは式を解析してから変換できることを提案しました。

(a + c) / b 

逆ポーランド記法

a c + b / 

どちらが処理しやすいですか。

この場合、数式モデルの保存を傍受し、ユーザー定義の数式から後置表記を生成できます。後置記法があれば、式を左から右に評価するループを書くのはかなり簡単です。

Django での実装に関しては、さまざまな入力フィールドをどのように数式にマップするかという問題が残っています。簡単な解決策は、入力ごとに定義されたシンボル名 (「a」、「b」、または「c」) との多対多の関係を使用する派生フィールドを表すモデルです。

パフォーマンスが非常に重要な場合は、後置式をデータに適用する前に何らかの方法で前処理を行うことができます。

于 2009-05-11T08:41:14.077 に答える