Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

A python web application framework for tight DB/GUI coupling?

I'm a firm believer of the heretic thought of tight coupling between the backend and frontend: I want existing, implied knowledge about a backend to be automatically made use of when generating user interfaces. E.g., if a VARCHAR column has a maximum with of 20 characters, there GUIs should automatically constrain the user from typing more than 20 characters in a related form field.

And I have strong antipathy to ORMs which want to define my database tables, or are based on some hack where every table needs to have extra numeric ID columns because of the ORM.

I've looked a bit into Python database frameworks and I think I can conclude the SQLAlchemy fits best to my mentality.

Now, I need to find a web application framework which fits naturally with SQLAlchemy (or an equivalent) and perhaps even with my appetite for coupling. With "web application framework", I mean products/project such as Pyhons, Django, TurboGears, web2py, etc.

E.g., it should ideally be able to:

  • automatically select a suitable form widget for data entering a given column if told to do so; e.g., if the column has a foreign key to a column with 10 different values, widget should display the 10 possible values as a dropdown
  • auto-generate javascript form validation code which gives the end-user quick error feedback if a string is entered into a field which is about to end up in an INTEGER column, etc
  • auto-generate a calendar widget for data which will end up in a DATE column
  • hint NOT NULL constraints as javascript which complains about empty or whitespace-only data in a related input field
  • generate javascript validation code which matches relevant (simple) CHECK-constraints
  • make it easy to avoid SQL injection, by using prepared statements and/or validation of externally derived data
  • make it easy to avoid cross site scripting by automatically escape outgoing strings when appropriate
  • make use of constraint names to generate somewhat user friendly error messages in case a constrataint is violated

All this should happen dynamically, so table adjustments are automatically reflected on the frontend - probably with a caching mechanism, so that all the model introspection wouldn't kill performance. In other words, I don't want to repeat my model definition in an XML file (or alike) when it has already been carefully been defined in my database.

Does such a framework exist for Python (or for any language, for that matter)? If not: Which of the several Python web application frameworks will be least in the way if I were to add parts of the above features myself?

like image 608
Troels Arvin Avatar asked Sep 04 '08 08:09

Troels Arvin


2 Answers

web2py does most of what you ask:

Based on a field type and its validators it will render the field with the appropriate widget. You can override with

db.table.field.widget=...

and use a third party widget.

web2py has js to blocks the user from entering a non-integer in a integer field or a non-double in a double field. time, date and datetime fields have their own pickers. These js validation work with (not instead) of server side validation.

There is IS_EMPTY_OR(...) validator.

The DAL prevents SQL injections since everthing is escaped when goes in the DB.

web2py prevents XSS because in {{=variable}}, 'variable' is escaped unless specified otherwise {{=XML(variable)}} or {{=XML(variable,sanitize=True)}}

Error messages are arguments of validators for example

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

T is for internationalization.

like image 192
massimo Avatar answered Oct 22 '22 23:10

massimo


You should have a look at django and especially its newforms and admin modules. The newforms module provides a nice possibility to do server side validation with automated generation of error messages/pages for the user. Adding ajax validation is also possible

like image 41
Peter Hoffmann Avatar answered Oct 22 '22 22:10

Peter Hoffmann