2009-05-11 12 views
2

ユーザーが独自のカスタム式をデータの表に適用して新しいフィールドを派生させる方法を教えてください。Djangoのユーザー定義の派生データ

オープンWeb上で購読しているユーザーのためにたくさんのデータを保存して処理する予定のアプリケーションDjangoに取り組んでいます。 1ページのリクエストで100〜100,000回のセンサー読み取りを考える私はこのデータを使ってグラフを描画し、それを含むテーブルも表示します。私は、私のウェブサイトに自分自身を登録している(つまり、彼らはジャンゴモデルに対応している)私のユーザーによって定義されるセンサーのグループを期待しています。

私は、(セットアッププロセスの一環として)センサーデータから派生したフィールドをユーザーが作成できるようにしたいと考えています。例えば、ユーザは、平均住宅温度が(温度センサ1 +温度センサ2)/ 2であることを知り、それをグラフ上に表示したいことがある。また、太陽熱温水が温水のようにもっと面白いものを望むか​​もしれません。私は、これらの定義された数式を、このページのセンサデータを閲覧する他のすべてのユーザに保存します。

主な質問は、システムの中央で式を定義する方法です。私は数式を定義するためのユーザー定義の文字列(たとえば100文字の長さ)を持っていて、それを自分で解析しますか?定義されたユーザーを入力サンプルに置き換えてトーストと呼んでいますか?サーバ上に保存されているユーザー機能を評価する安全な方法:

更新は最後に、私は私が尋ねただけで答えを得ました。関数が定義されているときにクライアントでも同じ機能を評価することは、UIを直観的にするための素晴らしい方法です。

答えて

2

あなたのクライアントが誰であるかによって異なります。

WWW上でこれが「一般に公開」されている場合は、自分で式を解析する必要があります。 Pythonコンパイラを使用して、Python構文をコンパイルすることができます。また、Python構文のサブセット用に独自のコンパイラを作成することもできます。多くの例があります。 plyプロジェクトから始めてください。

これが社内の場合(「ファイアウォールの背後にある」)、投稿にPythonコードを付けてそのコードを実行させます。

環境にはfrom math import *の機能を使用できます。

は、コードの彼らの供給ラインを中心に、以下を折る:

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

次にあなたが関数定義をexecし、悪い事が起こっなしで定義された関数を使用することができます。

execが「セキュリティ上の問題」を抱いている人もいますが、ユーザーの共有パスワードよりもセキュリティ上の問題はなく、重要なファイルを削除するか、プログラムの実行中にランダムに電源を切るなど意図的に愚かなことを行います。

execは、誰かがアクセスできるようにしておけばセキュリティ上の問題になります。社内アプリケーションでは、ユーザーを知っています。それらを訓練する。

+0

plyプロジェクトへのポインタをありがとう。これはWWWのアプローチに公開されています。私は、一般のメンバーがちょうどさまようと期待しています。これは、クラッカーが私よりもはるかに創造的なので、これはexecを除外します。 –

+0

最初のPLYの例(http://www.dabeaz.com/ply/example.htmlを参照)は私が必要とするものです。どうもありがとうございました –

0

は、別のユーザーがそのポストではC. でsimilar questionを尋ね、ウォーレンは、式が処理しやすいreverse polish notation

a c + b/

に解析し、

(a + c)/b 

から変換することができることを示唆しました。

この場合、数式モデルの保存を傍受して、ユーザー定義の式から後置記号を生成できます。ポストフィックス記法を使用すると、数式を左から右に評価するループを書くのはかなり簡単です。

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

パフォーマンスが本当に重要な場合は、後でデータに適用する前に、後処理式を何らかの形で前処理することがあります。

+0

あなたの質問は興味深いですが、この回答は理解しにくいです。それは簡潔に見え、何も説明していない。 –

+0

コメントありがとう、私は新しいバージョンが理解しやすいことを願っています。 –

2

私は[+、 - 、*、/、(、)など]をサポートし、クライアントサイド(javascript)を開発して、これらの値を編集してデータの新しいフィールドに適用したいと考えています。私はこのサーバー側のいずれかを行う必要はないと思っています。その結果、より敏感で楽しいユーザーエクスペリエンスが実現します。

ユーザーが数式を保存してサイトに戻ったときに再ロードできるようにすると、ブラウザですべての計算を実行できるようになります。彼らのフォーラムの1つをあなたのデータに適用することによって生成されるデータの列を追加するためのいくつかの一般的な方法を提供してください。

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

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

+0

私は完全に経験を向上させるためにJavaScriptに同意します。私は、人々が最初に定義するために何らかのUIを超えて、いわば「オンザフライ」で式を追加する可能性を考慮していませんでした。 サイトのユーザーを追跡する予定です(登録ユーザーになる予定です)ので、数式の保存はかなりシンプルにすべきです。私はすでにYUI DataTable(http://developer.yahoo.com/yui/datatable/)の使用を検討中です。 –

+0

JavaScriptは、ユーザーが操作できるものを制限できる限り、数式をかなり簡単に解釈できるようにする必要があります。 –

+0

もうひとつ考慮すべきことは、結果を毎回保存すると、多くのデータが得られることになります。 YUIデータテーブルは、開始するのに適しています。あなたのグラフ(http://solutoire.com/flotr/)にflotrを使用したいと思います。 –

関連する問題