Creazione di un motore di template - punto di partenza

0

Stiamo costruendo un progetto basato su Django con un componente template / generatore. Questo componente sarà separato dal progetto in quanto tale e può essere Django / Python, Node, Java o qualsiasi altra cosa. L'idea è di generare domande basate su un modello. Ad esempio, vorrei generare domande come "Cosa sono 2 + 3", "Che cosa è 5 + 8" in base al modello "Cosa è X + Y; dove X, Y < 10". In questo senso, è come un motore di template.

I modelli conterranno riferimenti ad oggetti con proprietà definite nel DB, ad esempio un bus. Ad esempio, potrebbe essere qualcosa di simile

[object type="vehicle" weight="heavy"]

e dovrebbe estrarre un oggetto casuale dal DB che soddisfi i criteri: type="vehicle" weight="heavy" (bus / camion / jet) e quindi sostituire quel tag con un'immagine, ad esempio, di un Bus . Inoltre dovrebbe essere in grado di gestire alcuni processi. Ad esempio:

What is [X type="integer" lte="10"] + [Y type="integer" lte="10"]

[option X+Y correct_ans="true"]

[option X-Y correct_ans="false"]

[option X+y+1 correct_ans="false"]

Il motore dovrebbe riempire un valore intero casuale < = 10 per X e Y e mostrare radiobox per ognuna delle opzioni. Dovrebbe anche memorizzare il fatto che la prima opzione è la risposta corretta.

Ha senso scrivere qualcosa da zero? Oppure è meglio usare un sistema di template esistente (come il proprio sistema di template di Django ) come punto di partenza? Qualche suggerimento su come posso avvicinarmi a questo?

modifica: chiarimento del caso d'uso

    
posta Anirudh 29.06.2012 - 09:12
fonte

1 risposta

3

Prima di tutto, penso che avere il sistema di template per estrarre direttamente gli elementi dal database sia una cattiva idea. Introduce un accoppiamento stretto tra i modelli (presentazione) e il database (archiviazione dati), senza alcun modo di aggiungere alcuna logica tra i due. Ciò significa che qualsiasi modifica allo schema del database ha un potenziale impatto sui tuoi modelli e vv.

Invece, il motore di template dovrebbe essere in grado di consumare strutture di dati arbitrarie, purché implementino un'interfaccia simile a un dizionario. Se si introduce la capacità di chiamare funzioni / metodi, è possibile avere la stessa funzionalità, solo in cima agli oggetti anziché al database nudo. Se i tuoi oggetti hanno proprietà di caricamento lento, puoi anche attivare i viaggi nel database dal modello dopo aver richiesto (tale richiesta), solo che la richiesta passa ancora attraverso la normale logica dell'applicazione prima di colpire il database. Ciò non significa solo che puoi modificare lo schema del tuo database e prendere la regressione attraverso l'uso di adattatori di compatibilità, ma ti permette anche di:

  • aggiungi autorizzazione all'accesso ai dati
  • pre-massaggio dei dati prima di inviarli al modello
  • visualizza dati da fonti diverse da un database
  • implementa tutti i tipi di memorizzazione nella cache
  • fai i18n chiamando una funzione speciale (molti template engine chiamano _() ) su qualsiasi cosa tu voglia tradurre (e, ovviamente, implementando quella funzione speciale per fare la tua traduzione)

In genere, questo viene risolto passando una struttura dati al motore del modello durante la valutazione di un modello oppure creando i modelli in modo tale che qualsiasi cosa sia attualmente in ambito al momento della chiamata del modello, sia accessibile nel modello.

Per quanto riguarda l'idea di inventare il proprio motore di template: creare template engine è molto divertente, specialmente se si amano costruire parser e lexer e ottimizzare gli AST e ottimizzare il codice di rendering, ma prima salta sul mercato e vedo cosa c'è già fuori Là. Questa pagina (nonostante la fonte, non specifica di CherryPy) offre un buon punto di partenza. Se sai per certo che non esiste un motore di template che soddisfi le tue esigenze, devi assolutamente crearne uno, ma tieni presente che è più difficile di quanto sembri.

    
risposta data 29.06.2012 - 09:38
fonte

Leggi altre domande sui tag