2010-05-30 15 views
10

Recentemente ho scritto un semplice e piccolo server HTTP incorporato per la mia app C++ (QT) e ho giocato un po 'con Ry's http-parser e amato it. Questo ragazzo è pazzo.Porting del motore di modelli di Django su C

Quindi mi sono detto: "Ehi, perché non portare il motore del template django in C?" Sarebbe fantastico! Lo so, non sarà un compito facile (per niente, lo so) ma mi piacerebbe davvero implementarlo. Quindi sono venuto qui per ispirazione, idee, opinioni ...

Mi piacerebbe molto avere alcuni suggerimenti sull'argomento, idee, cosa è già stato fatto, quali problemi principali incontrerò (e come risolverli) - Come non reinventare la ruota ... comunque, hai avuto l'idea :)

Grazie mille volte!

P.S. Snippet di codice semplici e collegamenti a strumenti e librerie sono molto benvenuto!

P.P.S. Sono già a conoscenza di grantlee, ho dato un'occhiata alle sue fonti. Bene ... questo è C++ ed è specifico per Qt.

+0

Ho appena trovato questo http://github.com/panyam/mango forse, sarà d'aiuto? Non so ancora di cosa si tratta, ma sto leggendo le fonti – sandra

+1

Riguarda il porting di template di django per l'erlang, ma almeno si tratta del porting di questo particolare progetto: [Scrivi un Template Compiler per Erlang] (http: // www .evanmiller.org/write-a-template-compiler-for-erlang.html) – miku

+0

Grazie, @The MYYN! Penso di aver avuto l'idea, l'articolo è davvero molto carino! – sandra

risposta

6

Hmm, non vedo perché qualsiasi cosa nel codice dei modelli di Django sia difficile da implementare in C. La sintassi del template sembra un po 'pitonica, ma in realtà non è python; hanno implementato il proprio parser per questo. Quindi il primo posto da guardare sarebbe il django template implementation in python. Non è molto codice, ed è ragionevolmente facile da capire.

Ovviamente, C sarà molto più dettagliato. Quello che stai scrivendo è esattamente un compilatore: legge in qualche codice (i modelli di Django) e scrive del codice in un'altra lingua (l'html). Quindi tutta la documentazione che è possibile trovare sulla scrittura di compilatori in C (ad esempio tokenizer + parser + generatori di codice) è rilevante.

In primo luogo è probabile che si desideri generare un albero di sintassi. La sintassi dei modelli di django è molto regolare ... ogni blocco ha un blocco {% endwhatever %} corrispondente, quindi il parser potrebbe effettivamente generare l'albero senza sapere realmente quali potrebbero essere tutte le parole chiave whatever.

Quindi, si cammina attraverso l'albero, facendo la fase "codice gen" per ogni blocco. Ad esempio, potresti codificare lo {% if %} controllando il valore del parametro if e stampandone il contenuto o nulla, a seconda che la clausola if sia vera o falsa. E così via con loop, filtri, blocchi, ecc.

Attenzione, tutto questo è molto lavoro ... hai considerato di incorporare un interprete Python nel tuo programma C? (Seriamente! Non è così difficile da fare, dal momento che l'interprete python è open source.)

+0

Grazie, apenwarr! Questo è in effetti quello che sto facendo in questo momento. Scrivi prima un tokenizer e poi un parser per ogni token. e assemblare il tutto. Non sarà facile e dovrò trovare un modo carino per dichiarare e usare contesti di variabili di diverso tipo. Ma è comunque divertente :) – sandra

0

Ci stai ancora lavorando? Sarei interessato a vedere cosa ne pensi e usarlo come punto di partenza molto presto. Ho un paio di cose in uso in questo momento, come un semplice POSIX che regex in ctypes per fare le operazioni più comuni per me. Ha dimostrato di essere più veloce durante il looping di grandi quantità di sostituzioni senza uscire da cpp.

1

Se voi o chiunque altro è interessato a un'implementazione C++ del motore di template Django, ci sto lavorando: http://git.fawek.net/Cjango/. Non è ancora pronto però.

+0

Come gestisce tag e filtri modello personalizzati? –

+0

TagNodeFactory e FilterFactory sono le due interfacce utilizzate dal lato client per l'inserimento di funzionalità personalizzate. Il primo accetta una funzione di fabbrica (per ogni nome di tag) che assegna un oggetto di una sottoclasse TagNode ogni volta che è necessario nell'albero del modello. Con quest'ultimo è sufficiente assegnare un oggetto Filter a un determinato nome di filtro. –

1

Per riferimento, onion dispone di un modello di modello Django-link.

Compila il modello in C e consente anche un po 'di debugging su gdb.

Il codice generato è piuttosto orientato alla cipolla, ma con un po 'di lavoro può essere più generico.

4

Nel caso in cui sia utile, il framework Synth presenta una completa implementazione stand-alone del sistema di template di Django in C++. Comprende tutti gli built-in tags and filters e il supporto per quelli personalizzati; oltre alla libreria stessa, ci sono collegamenti Python, oltre a uno strumento da riga di comando nativo, in grado di leggere i dati da fonti arbitrarie come JSON, INI o XML.

Problemi correlati