2009-12-02 10 views
14

Sto cercando di trovare l'architettura ottimale per un'applicazione Django ajax-heavy che sto attualmente costruendo. Mi piacerebbe mantenere un modo coerente di fare moduli, convalida, recupero dei dati, formato dei messaggi JSON ma trovo estremamente difficile trovare una soluzione che possa essere utilizzata in modo coerente.Architettura Ajax nell'applicazione Django

Qualcuno può indicarmi la giusta direzione o condividere la loro opinione sulle migliori pratiche?

+6

Cosa c'è di così speciale in Ajax? Dal punto di vista del Django queste sono solo richieste. – GabiMe

+1

Nient'altro, ma mi trovo a odiare, ad esempio, il mixing del rendering dei template con il normale ciclo di richiesta/risposta e il contenuto proveniente dalle richieste di ajax. Sembra impuro. –

risposta

2

Non riesco a pensare ad alcun modo standard per inserire ajax in un'applicazione Django, ma puoi dare un'occhiata a questo tutorial.

Potrai anche trovare maggiori dettagli sul django's page about Ajax

2

Due settimane fa ho fatto un write up come a implementare sotto-modelli per usarli in "normale" e la richiesta "Ajax" (per Django è lo stesso). Forse è utile per te.

4

Rendo tutto come visualizzazioni normali che vengono visualizzate normalmente nel browser. Ciò include tutte le risposte alle richieste AJAX (sotto pagine).

Quando voglio rendere più dinamici i bit del sito, utilizzo jQuery per eseguire AJAX o, in questo caso, AJAH e caricare il contenuto di una delle div nella pagina secondaria nella pagina di richiesta.

Questa tecnica funziona molto bene: è molto facile eseguire il debug delle pagine secondarie in quanto sono pagine normali, e jQuery rende la vita molto facile utilizzando queste come parte di una pagina di AJA [XH].

+0

Ok, sembra ragionevole. Ma fai funzioni di visualizzazione separate per richieste AJAX e richieste ordinarie o usi if_ajax() per restituire risposte diverse? Per quanto riguarda i moduli, usi le richieste ordinarie per inviare i dati del modulo o lo fai usando AJAX? –

+0

Eseguo una vista che funziona prima nel browswer, quindi uso jQuery per estrarre i bit rilevanti da esso e inserirli nella pagina di richiesta. Non ho ancora usato 'is_ajax'. Per quanto riguarda i moduli, io uso l'invio del modulo jQuery per le pagine dinamiche sì. Questi POST ad una normale vista django. –

+0

Sono un principiante ajax/django, ma il tuo metodo non è molto inefficiente? Significa restituire molto più del necessario (tutto l'HTML circostante, invece dei dati effettivi). O mi sta sfuggendo qualcosa? –

2

+1 a Nick per pagine che si presentano normalmente nel browser. Questo sembra essere il miglior punto di partenza.

Il problema con i più semplici approcci AJAX, come Nick e vikingosegundo, è che dovrete fare affidamento sulla proprietà innerHTML nel vostro Javascript. Questo è l'unico modo per scaricare il nuovo HTML inviato nel JSON. Alcuni considererebbero questa una brutta cosa.

Purtroppo non sono a conoscenza di un modo standard per replicare la visualizzazione dei moduli utilizzando Javascript che corrisponde al rendering di Django. Il mio approccio (su cui sto ancora lavorando) è di sottoclasse la classe Django Form in modo che emetta bit di Javascript insieme all'HTML da as_p() ecc. Questi replicano quindi il modulo che manipolo il DOM.

2

Per esperienza, so che gestire un'applicazione in cui si genera l'HTML sul lato server e semplicemente "inserirla" nelle proprie pagine, diventa un incubo. È anche impossibile testare usando il framework di test di Django. Se stai usando Selenium o uno strumento simile, va bene, ma devi aspettare che la richiesta di ajax venga restituita, quindi hai bisogno di tonnellate di sonno nello script di test, il che potrebbe rallentare la tua suite di test.

Se lo scopo di utilizzare la tecnica Ajax è quello di creare una buona interfaccia utente, consiglierei di andare all in, come l'interfaccia GMail, e fare tutto nel browser con JavaScript. Ho scritto diverse app come questa usando nient'altro che jQuery, macchine a stati per la gestione dello stato dell'interfaccia utente e JSON con ReST sul backend. Django, IMHO, è un abbinamento perfetto per il back-end in questo caso. Esistono anche software di terze parti per la generazione di un'interfaccia ReST per i tuoi modelli, che non ho mai usato io stesso, ma per quanto ne so sono bravissimi alle cose semplici, ma ovviamente devi ancora fare la tua logica di business .

Con questo approccio, si incontra il problema della duplicazione del codice nel JS e nel back-end, come la gestione dei moduli, la convalida, ecc.Ho pensato di risolvere questo problema con la generazione di informazioni strutturate sulle forme e sulla logica di convalida che posso utilizzare in JS. Questo potrebbe essere compilato in fase di distribuzione e caricato come qualsiasi altro file JS.

Inoltre, evitare XML. I browser sono lenti a analizzarlo, è un dolore da generare e un dolore con cui lavorare nel browser. Usa JSON.

4

Per tutte le risposte a questo, non posso credere che nessuno abbia menzionato lo django-piston. È promosso principalmente per l'uso nella creazione di API REST, ma può generare JSON (che jQuery, tra gli altri, può consumare) e funziona proprio come le viste in quanto è possibile fare qualsiasi cosa con una richiesta, rendendolo un'ottima opzione per implementare le interazioni AJAX (o AJAJ [JSON], AJAH, ecc.). Supporta anche form validation.

1

Im attualmente testando:

  • jQuery & backbone.js lato client

  • django-pistone (strato intermedio)

scriverà più tardi le mie scoperte sul mio blog http://blog.sserrano.com