instalar - mysql connector python
¿Un marco de aplicación web python para un acoplamiento fuerte de DB/GUI? (5)
Soy un firme creyente del pensamiento herético de un estrecho acoplamiento entre el backend y el frontend: quiero que el conocimiento implícito existente sobre un backend se use automáticamente al generar interfaces de usuario. Por ejemplo, si una columna VARCHAR tiene un máximo de 20 caracteres, las GUI obligarán automáticamente al usuario a escribir más de 20 caracteres en un campo de formulario relacionado.
Y tengo una gran antipatía por los ORM que quieren definir las tablas de mi base de datos, o están basados en algún truco en el que cada tabla necesita tener columnas adicionales de identificación numérica debido al ORM.
He analizado un poco las estructuras de bases de datos de Python y creo que puedo concluir que SQLAlchemy se ajusta mejor a mi mentalidad.
Ahora, necesito encontrar un marco de aplicación web que encaje naturalmente con SQLAlchemy (o un equivalente) y quizás incluso con mi apetito por el acoplamiento. Con "framework de aplicaciones web" me refiero a productos / proyectos como Pyhons, Django, TurboGears, web2py, etc.
Por ejemplo, idealmente debería ser capaz de:
- seleccione automáticamente un widget de formulario adecuado para los datos que ingresan a una columna determinada si se le pide que lo haga; por ejemplo, si la columna tiene una clave externa para una columna con 10 valores diferentes, el widget debe mostrar los 10 valores posibles como un menú desplegable
- Genere automáticamente el código de validación de formulario de JavaScript que proporciona al usuario final comentarios rápidos de error si se ingresa una cadena en un campo que está a punto de terminar en una columna INTEGER, etc.
- generar automáticamente un widget de calendario para los datos que terminarán en una columna FECHA
- sugerencias NOT NULL como javascript que se queja de datos vacíos o de solo espacio en blanco en un campo de entrada relacionado
- generar código de validación de JavaScript que coincida con las restricciones CHECK relevantes (simples)
- facilite evitar la inyección de SQL , mediante el uso de declaraciones preparadas y / o la validación de datos derivados externamente
- facilite evitar las secuencias de comandos entre sitios escapando automáticamente cadenas salientes cuando sea apropiado
- hacer uso de nombres de restricciones para generar mensajes de error que sean fáciles de usar en caso de que se viole una restricción
Todo esto debería suceder dinámicamente, de modo que los ajustes de la tabla se reflejen automáticamente en la interfaz, probablemente con un mecanismo de almacenamiento en caché, para que toda la introspección del modelo no mate el rendimiento. En otras palabras, no quiero repetir la definición de mi modelo en un archivo XML (o similar) cuando ya se ha definido cuidadosamente en mi base de datos.
¿Existe tal marco para Python (o para cualquier idioma, para el caso)? De lo contrario, ¿cuál de los varios frameworks de aplicaciones web de Python será el menor en el camino si tuviera que agregar partes de las características anteriores por mi cuenta?
Deberías echarle un vistazo a django y especialmente a sus nuevas formas y módulos de administración . El módulo newforms proporciona una buena posibilidad de realizar validaciones del lado del servidor con generación automática de mensajes / páginas de error para el usuario. Agregar la validación ajax también es posible
Sé que tu especificidad solicita un marco, pero pensé que te dejaría saber acerca de lo que tengo hasta aquí. Acabo de convertir la aplicación web de mi empresa de una capa ORM interna personalizada en sqlAlchemy, así que estoy lejos de ser un experto, pero algo que se me ocurrió fue que sqlAlchemy tiene tipos para todos los atributos que mapea de la base de datos, ¿por qué no? utilícelo para ayudar a generar el html correcto en la página. Así que usamos sqlAlchemy para la parte de atrás y plantillas de Cheetah para la interfaz pero todo en el medio es básicamente nuestra propia.
Nunca hemos logrado encontrar un marco que haga exactamente lo que queremos sin compromiso y preferimos obtener todos los bits que funcionen bien para nosotros y escribir el pegamento.
Paso 1. Para cada tipo de datos sqlAlchemy.types.INTEGER, etc. Agregue una función adicional a HTML (o quizás aHTMLReadOnly, aHTMLAdminEdit) y simplemente devuelva la plantilla para el html, ahora ni siquiera tiene que importar qué datos escriba su visualización si solo quiere escupir toda una tabla que simplemente puede hacer (como una plantilla de guepardo o lo que sea que sea su motor de plantillas).
Paso 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>
Usando este método básico y estirando la introspección de las pitones a su potencial, en una tarde logré hacer una actualización de lectura y un código de eliminación para toda nuestra sección administrativa de nuestra base de datos, aún no con el pulido de django pero más que suficiente para mis necesidades.
Paso 3 Descubrió la necesidad de un tercer paso el viernes, quería cargar archivos que, como usted sabe, necesita más información que el cuadro de texto predeterminado de tipos de datos varchar. Sin problema, simplemente anulé la clase de filas en la definición de mi tabla de VARCHAR a FilePath (VARCHAR) donde la única diferencia era que FilePath tenía un método toHtml diferente. Funcionó sin problemas.
Dicho todo esto, si hay un envoltorio retráctil que hace lo que quieres, úsalo.
Descargo de responsabilidad: este código fue escrito desde la memoria después de la medianoche y probablemente no producirá una página web en funcionamiento.
TurboGears actualmente usa SQLObject de manera predeterminada, pero puede usarlo con SQLAlchemy . Dicen que la próxima versión principal de TurboGears (1.1) usará SQLAlchemy de manera predeterminada.
Creo que los modelos Django no admiten claves primarias compuestas (ver documentación ). ¿Pero quizás puedas usar SQLAlchemy en Django? Una búsqueda en Google indica que puedes. No he usado Django, entonces no sé.
Te sugiero que eches un vistazo a:
- ToscaWidgets
- DBSprockets , incluido DBMechanic
- Pasarela . Catwalk es una aplicación para TurboGears 1.0 que usa SQLObject, no SQLAlchemy. También echa un vistazo a esta entrada de blog y screencast .
- FastData . También usa SQLObject.
- formalchemy
- Ron
No tengo ningún conocimiento profundo de ninguno de los proyectos anteriores. Estoy en el proceso de tratar de agregar algo similar a una de mis propias aplicaciones como lo que la pregunta original menciona. La lista anterior es simplemente una lista de proyectos interesantes con los que me he encontrado.
En cuanto a los frameworks de aplicaciones web para Python, recomiendo TurboGears 2. No es que tenga ninguna experiencia con ninguno de los otros frameworks, solo me gustan los TurboGears ...
Si el autor de la pregunta original encuentra una solución que funciona bien, actualice o responda este hilo.
web2py hace la mayor parte de lo que preguntas:
En función de un tipo de campo y sus validadores, representará el campo con el widget apropiado. Puede anular con
db.table.field.widget=...
y usa un widget de terceros.
web2py tiene js para evitar que el usuario ingrese un número entero en un campo entero o un no doble en un campo doble. los campos de hora, fecha y fecha y hora tienen sus propios selectores. Esta validación de js funciona con (no en lugar de) validación del lado del servidor.
Hay un IS_EMPTY_OR(...)
.
El DAL previene inyecciones de SQL ya que todo se escapa cuando entra en el DB.
web2py previene XSS porque en {{= variable}}, se escapó ''variable'' a menos que se especifique lo contrario {{= XML (variable)}} o {{= XML (variable, sanitize = True)}}
Los mensajes de error son argumentos de validadores, por ejemplo
db.table.field.requires=IS_NOT_EMPTY(error_message=T(''hey! write something in here''))
T es para la internacionalización.