2008-09-04 12 views
11

Ich glaube fest an den ketzerischen Gedanken der engen Kopplung zwischen Backend und Frontend: Ich möchte, dass existierendes, implizites Wissen über ein Backend automatisch beim Generieren von Benutzeroberflächen genutzt wird. Wenn z. B. eine VARCHAR-Spalte ein Maximum von 20 Zeichen aufweist, sollten GUIs den Benutzer automatisch davon abhalten, mehr als 20 Zeichen in einem verwandten Formularfeld einzugeben.Ein Python Web Application Framework für enge DB/GUI-Kopplung?

Und ich habe starke Antipathie zu ORMs, die meine Datenbanktabellen definieren möchten, oder basieren auf einigen Hack, wo jede Tabelle aufgrund des ORM zusätzliche numerische ID-Spalten haben muss.

Ich habe ein wenig in Python-Datenbank-Frameworks geschaut und ich denke, ich kann daraus schließen, dass die SQLAlchemy am besten zu meiner Mentalität passt.

Nun muss ich ein Webanwendungsframework finden, das natürlich zu SQLAlchemy (oder einem Äquivalent) passt und vielleicht sogar mit meinem Appetit auf Kopplung. Mit "Web Application Framework", I-Produkte bedeuten/Projekt wie Pyhons, Django, Turbogears, web2py usw.

Eg, sollte es im Idealfall der Lage sein: eine geeignete Form Widget

  • automatisch wählen für Daten, die in eine bestimmte Spalte eintreten, wenn sie dazu aufgefordert werden; Wenn die Spalte beispielsweise einen Fremdschlüssel für eine Spalte mit 10 verschiedenen Werten aufweist, sollte das Widget die 10 möglichen Werte als Dropdown-Liste anzeigen.
  • auto-generate Javascript Formular Validierungscode, der dem Endbenutzer schnelle Fehlerrückmeldung gibt, wenn a String wird in ein Feld eingegeben, die im Begriff ist, in einer Integer-Spalte enden, etc
  • automatisch generieren eine Kalender-Widget für Daten, die in einer Datumsspalte am Ende werden
  • hint NOT NULL Constraints wie JavaScript die sich über leere oder leere Daten in einem verwandten Eingabefeld beschwert
  • Javascript-Validierungscode erzeugen, das relevante übereinstimmt (einfaches) CHECK-Constraints
  • es leicht machen, zu Vermeiden SQL Injektion durch vorbereitete Anweisungen und/oder Validierung von extern abgeleiteten Daten
  • machen es leicht zu avoid Cross-Site-Scripting- durch automatisch ausgehende Strings entweichen kann, wenn entsprechende
  • nutzen Constraint Namen zu etwas benutzerfreundlichen Fehlermeldungen im Fall zu erzeugen ein constrataint verletzt wird

All dies sollte dynamisch passieren, also werden Tabellenanpassungen automatisch auf dem Frontend reflektiert - wahrscheinlich mit einem Caching-Mechanismus, so dass die gesamte Modellintrospektion die Leistung nicht zerstören würde. Mit anderen Worten, ich möchte meine Modelldefinition nicht in einer XML-Datei (oder ähnlichem) wiederholen, wenn sie bereits sorgfältig in meiner Datenbank definiert wurde.

Gibt es ein solches Framework für Python (oder für irgendeine andere Sprache)? Wenn nicht: Welches der verschiedenen Python-Webanwendungs-Frameworks wird mir am wenigsten in die Quere kommen, wenn ich Teile der oben genannten Features selbst hinzufügen würde?

Antwort

3

Sie sollten django und besonders seine newforms und admin Module betrachten.Das newforms-Modul bietet eine gute Möglichkeit, serverseitige Validierung mit automatischer Generierung von Fehlermeldungen/Seiten für den Benutzer durchzuführen. Hinzufügen von Ajax-Validierung ist auch possible

+0

Spielt Django gut mit SQLAlchemy? Zuletzt hatte ich gehört, dass der Django + SA Zweig moribund war und die ursprüngliche Frage SA als ORM der Wahl bezeichnete. –

1

Ich glaube, dass Django-Modelle Composite-Primärschlüssel nicht unterstützt (siehe documentation). Aber vielleicht können Sie SQLAlchemy in Django verwenden? A google search zeigt an, dass Sie können. Ich habe Django nicht benutzt, also weiß ich es nicht.

Ich schlage vor, Sie auf einen Blick:

Ich habe keine tiefen Kenntnisse von einem der oben genannten Projekte. Ich bin gerade dabei, etwas Ähnliches wie eine meiner eigenen Anwendungen hinzuzufügen, was die ursprüngliche Frage erwähnt. Die obige Liste ist einfach eine Liste von interessanten Projekten, über die ich gestolpert bin.

In Bezug auf Web Application Framework für Python, empfehle ich Turbogears 2. Nicht, dass ich mit einem des anderen Frameworks keine Erfahrung haben, ich Turbogears wie ...

Wenn die Autor der ursprünglichen Frage findet eine Lösung, die Funktioniert gut, bitte aktualisiere oder beantworte diesen Thread.

1

TurboGears verwendet derzeit SQLObject standardmäßig, aber Sie können es mit SQLAlchemy verwenden. Sie sagen, dass die nächste Hauptversion von TurboGears (1.1) SQLAlchemy standardmäßig verwenden wird.

1

Ich weiß, dass Sie Spezifität für ein Framework fragen, aber ich dachte, ich würde Sie wissen lassen, was ich hier mache. Ich habe gerade die Web-Anwendung meiner Firma von einer eigenen ORM-Schicht in sqlAlchemy umgewandelt, also bin ich weit von einem Experten entfernt, aber mir fiel auf, dass sqlAlchemy Typen für alle Attribute hat, die es aus der Datenbank abbildet, also warum nicht Verwenden Sie das, um das richtige HTML auf der Seite auszugeben. Also verwenden wir sqlAlchemy für das Backend und Cheetah Templates für das Frontend, aber alles dazwischen ist grundsätzlich unser eigenes.

Wir haben es nie geschafft, ein Framework zu finden, das genau das tut, was wir wollen, ohne Kompromisse und lieber alle Teile zu bekommen, die für uns richtig funktionieren und den Klebstoff selbst schreiben.

Schritt 1. Für jeden Datentyp sqlAlchemy.types.INTEGER usw. Fügen Sie eine zusätzliche Funktion zuHtml hinzu (oder viele vielleicht toHTMLReadOnly, toHTMLAdminEdit was auch immer) und lassen Sie einfach die Vorlage für den HTML zurück, jetzt haben Sie nicht einmal sich darum zu kümmern, welchen Datentyp Sie anzeigen, wenn Sie nur eine ganze Tabelle ausspucken möchten, die Sie einfach tun können (als Cheetah-Vorlage oder was auch immer Ihre Template-Engine ist).

Schritt 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>

Mit dieser grundlegenden Methode und Stretching Pythons Introspektion zu seinem Potenzial, in einem Nachmittag habe ich geschafft zu schaffen, lesen Update und Code für unsere gesamte Admin-Bereich der Datenbank löschen, noch nicht mit dem polnischen Django aber mehr als gut genug für meine Bedürfnisse.

Schritt 3 Entdeckt die Notwendigkeit für einen dritten Schritt nur am Freitag, wollte Dateien hochladen, die, wie Sie wissen, mehr als nur die Varchar-Datentypen Standard-Textfeld benötigt. Kein Problem, ich habe nur die Zeilen-Klasse in meiner Tabellendefinition von VARCHAR zu FilePath (VARCHAR) überschrieben, wo der einzige Unterschied darin lag, dass FilePath eine andere toHtml-Methode hatte. Einwandfrei gearbeitet.

Alles, was gesagt wird, wenn es einen Schrumpfschlauch gibt, der genau das tut, was Sie wollen, verwenden Sie das.

Haftungsausschluss: Dieser Code wurde nach Mitternacht aus dem Speicher geschrieben und wird vermutlich keine funktionierende Webseite erzeugen.

5

web2py tut das meiste, was Sie fragen:

Basierend auf einem Feldtyp und seine Validatoren es wird das Feld mit dem entsprechenden Widget machen. Sie können mit

db.table.field.widget=... 

überschreiben und ein Widget von Drittanbietern verwenden.

web2py hat js, um den Benutzer daran zu hindern, eine Nicht-Ganzzahl in ein Integer-Feld oder eine Nicht-Doppel in ein Doppelfeld einzugeben. Zeit, Datum und Datetime Felder haben ihre eigenen Picker. Diese js-Validierung arbeitet mit (nicht stattdessen) der serverseitigen Validierung.

Es gibt IS_EMPTY_OR(...) Validator.

Die DAL verhindert SQL-Injektionen, da alles, was in die DB gelangt, ausgeblendet wird.

web2py verhindert XSS weil in {{= variable}}, 'Variable' entkommen, wenn nicht anders angegeben {{= XML (Variable)}} oder {{= XML (Variable, Desinfizieren = True)}}

Fehlermeldungen sind Argumente von Validatoren zum Beispiel

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

T für die Internationalisierung ist.