2011-12-12 10 views
5

c'è un amministratore CRUD generico per Flask basato su WTForms?Amministratore CRUD generico per Flask, con WTForms?

Attualmente stiamo costruendo un sistema di backend ibrido dove admin deve CRUD molti dati provenienti da varie fonti, MongoDB, Redis, file ini, ENVIRON, ecc. Scrivere una vista di amministrazione specifica per ognuno di essi sembra una perdita di tempo, ma tutto Le soluzioni di amministrazione di Flask admin o WTForms si basano su un tipo di ORM fisso, ad es MongoEngine, AppEngine Datastore, SQLAchemy, ecc.

Sono disponibili altri generici che consentono di generare automaticamente l'amministratore agnostico ORM?

ho bisogno di fornire le seguenti funzioni

  • visualizzazione elenco per un gruppo di elementi, supporta la modifica o di lotto azioni in linea sarebbe grande!
  • modificare vista per una voce specifica per aggiungere/modificare

Basta definire qualche modello Form, implementare un metodo di iterazione e auto generare un amministratore pieno titolo.

Esistono progetti OSS riutilizzabili come questo?

+0

Non dovrebbe essere molto difficile creare un po 'di software che prende nei documenti, e in base al documento, genera una classe WTForm per ogni documento (che è che ogni documento può avere diversi set di dati su di loro anche se sono destinati a rappresentare oggetti simili - la flessibilità di no-sql e tutti ...). Quindi è possibile utilizzare una cianografia nel pallone per registrare una funzione di visualizzazione in grado di afferrare un oggetto, generare il modulo e visualizzare il modulo all'utente. Introspecting quale forma del widget e la convalida di cui avete bisogno sarebbe la parte difficile, come indica la risposta qui sotto. – tkone

risposta

2

La risposta breve è no, per quanto ne so, non esiste un ORM auto-generante per redis o MongoDB.

Ora, per una spiegazione più dettagliata:

Il motivo per cui esiste generazione CRUD per archivi di dati 'fissi' ORM e non con sede a dischi a forma libera è semplice: la natura stessa dei record a forma libera rende difficile per creare uno schema.

Diamo un'occhiata a redis per esempio, diciamo che ogni record era un hash, ad es. chiave 'user- {id}' con campi username, age e registered_on. Ora, cosa succede quando aggiungi un nuovo campo "posizione" agli utenti? Bene, ai redis non importa, basta aggiungere il campo a qualsiasi record mentre vengono modificati, non è necessario tornare indietro e aggiungere il campo a ogni hash. Abbastanza semplice

Ma ora avete la vostra magia CRUD, che cerca di capire quali campi mostrare. Supponiamo che tu decida di guardare il primo record per vedere quali campi esistono, ma cosa succederebbe se all'utente-1 mancasse quel nuovo campo "posizione"? Ora il CRUD non lo genererà.

Inoltre, poiché redis memorizza ogni valore come una stringa, un CRUD non saprebbe che 'age' ad esempio accetta solo un numero intero e registered_on è in realtà una stringa di data in formato ISO.

Oh, ma tu dici, MongoDB ha i tipi di dati! sicuramente, supponendo di ignorare i diversi campi per indennità di registrazione, facendo finta di avere lo stesso set di campi per record, è possibile fare qualche CRUD automagico lì? Ebbene sì, sarai in grado di fare un po 'meglio rispetto a Redis, perché ad es. un tipo di data e un tipo intero, ma ci sono alcune discrepanze anche allora. Supponi di avere un valore stringa. Come fai a sapere se quel valore di stringa richiede un input su più righe (area di testo) o su una riga (tipo di input = testo), oppure è disponibile solo da una selezione a discesa di alcune scelte?

Per questo motivo, l'unico modo per fare un CRUD teorico per molti tipi di forme libere sarebbe se si definisse in anticipo lo 'schema' (tramite una definizione del modulo forse?) Per ogni record e magari implementato un po ' una sorta di classe di interfaccia/contratto che consentiva a uno strumento CRUD di elencare i record per recuperare oggetti, recuperare un singolo record per chiave, aggiornare/creare un record e cancellare un singolo record per chiave.

Un tale strumento CRUD "accoppiato" teorico sarebbe davvero bello, e mi piacerebbe vedere qualcuno che lo faccia.

+0

Grazie per la risposta. "sarebbe se si definisse in anticipo lo 'schema' (tramite una definizione del modulo forse?)" Questo è esattamente ciò che intendevo. Predefinisco un modulo (noto anche come schema e tipo di dati), con i metodi CRUD, quindi auto generare l'amministratore convalidato. – est

3

suggerirei di esaminare il seguente:

https://github.com/sbook/flask-mongoengine

https://github.com/coleifer/flask-peewee

Si potrebbe prendere pallone-mongoengine di sbook e admin porto di coleifer dalla boccetta-peewee ad esso. Non immagino che sarebbe troppo difficile. L'amministratore di Coleifer ottiene punti extra per l'uso di twitter-bootstrap e posso dirti che è molto sensibile ai problemi.

Ho lavorato con il mongoengine sul pallone e anche con il pallone-peewee ed entrambi sono eccellenti.

+0

Grazie per i suggerimenti, ma il punto di ORM-agnostic è quello di costruire l'amministratore in cima ai dati senza schema, come k-v db, json, ecc. Peewee e MongoDB ha risolto i backend. – est

+0

Non sono sicuro di cosa intendi quando dici che MongoDB ha "fixed backends"? Per quello che descrivi, potresti voler dare un'occhiata a minimongo: https://github.com/slacy/minimongo Sarebbe un lavoro leggero avvolgere un campo wtform o flatland in setattr/getattr con minimongo. Solo un'idea –

+0

Intendo fiaschetta-mongoengine è fisso backend con MongoDB. Non ho bisogno di un wrapper di accesso attorno a MongoDB, ho bisogno di generare automaticamente l'amministrazione CRUD per i backend ibridi. – est