11

私は、バックエンドとフロントエンドの間の緊密な結合という異端的な考えを固く信じています。ユーザーインターフェイスを生成するときに、バックエンドに関する既存の暗黙の知識を自動的に利用したいと考えています。たとえば、VARCHAR列の最大文字数が20文字の場合、GUIは、ユーザーが関連するフォームフィールドに20文字を超えて入力することを自動的に制限する必要があります。

また、データベーステーブルを定義したいORMや、ORMのためにすべてのテーブルに追加の数値ID列が必要なハックに基づいているORMには強い反感があります。

私はPythonデータベースフレームワークを少し調べましたが、SQLAlchemyが私の考え方に最も適していると結論付けることができると思います。

ここで、SQLAlchemy(または同等のもの)に自然に適合し、おそらく結合への欲求にも適合するWebアプリケーションフレームワークを見つける必要があります。「Webアプリケーションフレームワーク」とは、Pyhons、Django、TurboGears、web2pyなどの製品/プロジェクトを意味します。

たとえば、理想的には次のことができるはずです。

  • 指示された場合、特定の列に入力するデータに適したフォームウィジェットを自動的に選択します。たとえば、列に10個の異なる値を持つ列への外部キーがある場合、ウィジェットは10個の可能な値をドロップダウンとして表示する必要があります
  • INTEGER列などに文字列が入力されようとしているフィールドに文字列が入力された場合に、エンドユーザーに迅速なエラーフィードバックを提供するjavascriptフォーム検証コードを自動生成します。
  • 最終的にDATE列になるデータのカレンダーウィジェットを自動生成します
  • 関連する入力フィールドの空または空白のみのデータについて文句を言うjavascriptとしてNOTNULL制約をヒントします
  • 関連する(単純な) CHECK制約に一致するjavascript検証コードを生成します
  • プリペアドステートメントや外部から派生したデータの検証を使用して、SQLインジェクションを簡単に回避できるようにします
  • 必要に応じて発信文字列を自動的にエスケープすることにより、クロスサイトスクリプティングを簡単に回避できます
  • 制約に違反した場合に備えて、制約名を使用して、ユーザーフレンドリーなエラーメッセージを生成します。

これはすべて動的に行われる必要があるため、テーブルの調整はフロントエンドに自動的に反映されます。おそらくキャッシュメカニズムを使用して、すべてのモデルのイントロスペクションによってパフォーマンスが低下することはありません。つまり、データベースでモデル定義がすでに慎重に定義されている場合は、XMLファイル(または同様のファイル)でモデル定義を繰り返したくありません。

そのようなフレームワークはPython(またはそれに関しては任意の言語)に存在しますか?そうでない場合:上記の機能の一部を自分で追加した場合、いくつかのPython Webアプリケーションフレームワークのどれが最も邪魔になりませんか?

4

5 に答える 5

5

web2py はあなたが求めることのほとんどを行います:

フィールド タイプとそのバリデータに基づいて、適切なウィジェットでフィールドをレンダリングします。でオーバーライドできます

db.table.field.widget=...

サードパーティのウィジェットを使用します。

web2py には、ユーザーが整数フィールドに非整数を入力したり、倍精度フィールドに倍精度以外を入力したりすることをブロックする js があります。time、date、および datetime フィールドには、独自のピッカーがあります。これらの js 検証は、(代わりではなく) サーバー側の検証と連携します。

バリデーターがありIS_EMPTY_OR(...)ます。

DBに入るときにすべてがエスケープされるため、DALはSQLインジェクションを防ぎます。

{{=variable}} では、{{=XML(variable)}} または {{=XML(variable,sanitize=True)}} と指定しない限り、'variable' がエスケープされるため、web2py は XSS を防ぎます。

エラーメッセージは、たとえばバリデータの引数です

db.table.field.requires=IS_NOT_EMPTY(error_message=T('hey! write something in here'))

T は国際化用です。

于 2008-10-13T17:31:38.343 に答える
3

django、特にそのnewformsadminモジュールを確認する必要があります。newformsモジュールは、ユーザーのエラーメッセージ/ページの自動生成を使用してサーバー側の検証を行うための優れた可能性を提供します。ajax検証を追加することも可能です

于 2008-09-04T09:12:27.613 に答える
1

Djangoモデルは複合主キーをサポートしていないと思います(ドキュメントを参照)。しかし、おそらくDjangoでSQLAlchemyを使用できますか?グーグル検索はあなたができることを示しています。私はDjangoを使ったことがないので、わかりません。

以下をご覧になることをお勧めします。

私は上記のプロジェクトについて深い知識を持っていません。私は、元の質問に記載されているように、自分のアプリケーションの1つに似たものを追加しようとしているところです。上記のリストは、私が偶然見つけた興味深いプロジェクトのリストにすぎません。

Python用のWebアプリケーションフレームワークについては、TurboGears 2をお勧めします。他のフレームワークの経験があるわけではなく、TurboGearsが好きです...

元の質問の作成者がうまく機能する解決策を見つけた場合は、このスレッドを更新または回答してください。

于 2008-09-04T09:42:10.333 に答える
1

あなたの特異性がフレームワークを求めていることは知っていますが、私がここで何をしているのかをあなたに知らせたいと思いました。会社のWebアプリケーションをカスタムの社内ORMレイヤーからsqlAlchemyに変換したばかりなので、専門家からはほど遠いですが、sqlAlchemyには、データベースからマップするすべての属性の型があるので、なぜですか?これを使用して、適切なhtmlをページに出力します。したがって、バックエンドにはsqlAlchemyを使用し、フロントエンドにはCheetahテンプレートを使用しますが、その間のすべては基本的に私たち自身のものです。

私たちは妥協することなく私たちが望むことを正確に実行するフレームワークを見つけることができず、私たちのために正しく機能するすべてのビットを取得し、自分で接着剤を書くことを好みます。

ステップ1.データ型ごとにsqlAlchemy.types.INTEGERなど。追加の関数toHtml(または多くの場合toHTMLReadOnly、toHTMLAdminEditなど)を追加し、それがhtmlのテンプレートを返すようにします。これで、どのデータを気にする必要もありません。テーブル全体を吐き出したいだけの場合は、表示を入力します(cheetahテンプレートまたはテンプレートエンジンとして)。

ステップ2

<table>

<tr>

#for $field in $dbObject.c:

<th>$field.name</th>

#end for

</tr>

<tr>

#for $field in dbObject.c:

<td>$field.type.toHtml($field.name, $field.value)</td>

#end for

</tr>

</table>

この基本的な方法を使用し、pythonの内省をその可能性にまで広げて、午後に、データベースの管理セクション全体の読み取り更新と削除コードを作成することができました。まだdjangoを磨いてはいませんが、私のニーズには十分です。

ステップ3金曜日に3番目のステップの必要性を発見し、varcharデータ型のデフォルトのテキストボックスよりも多くのファイルが必要なファイルをアップロードしたいと考えました。汗を流さずに、テーブル定義の行クラスをVARCHARからFilePath(VARCHAR)に上書きしました。唯一の違いは、FilePathのtoHtmlメソッドが異なることだけでした。完璧に動作しました。

とはいえ、必要なことを実行するシュリンクラップがそこにある場合は、それを使用してください。

免責事項:このコードは深夜以降にメモリから書き込まれ、機能するWebページを生成しない可能性があります。

于 2008-09-07T14:39:14.803 に答える
1

TurboGearsは現在、デフォルトでSQLObjectを使用していますが、 SQLAlchemyで使用できます。彼らは、TurboGears (1.1) の次のメジャー リリースでは、デフォルトで SQLAlchemy を使用すると言っています。

于 2008-09-07T10:03:48.647 に答える