2010-01-24 14 views
7

Questa è una domanda generale su come limitare i framework di sviluppo Web come Django e ruby-on-rails.Come limitare i framework Web

Sto pianificando di creare un servizio web RESTful che abbia un'interfaccia puramente JSON/XML, nessuna GUI. Il servizio si baserà su un database, tuttavia per alcune delle operazioni più importanti non esiste un modo chiaro per mantenere un oggetto "modello" direttamente in una tabella di database. Inoltre, richiedo il pieno controllo su quando e come i dati vengono scritti nel database. Dovrò mantenere più connessioni al database per utilizzare alcune connessioni solo per le letture e altre solo per le scritture.

Ho esaminato i framework MVC "completi" come Django e altri di base come web.py e piloni. L'impressione che ho attualmente è che se vado con il framework completo inizialmente le cose andranno più velocemente ma alla fine mi bloccherò perché sarò limitato dal framework in quello che posso fare. Se vado con un quadro più basilare ci vorrà molto più tempo per far funzionare tutto, ma sarò libero di fare ciò di cui ho bisogno.

Questo è quello che sembra, ma ho il sospetto che potrebbe essere un'impressione errata dato quanti siti sono scritti in Django e Rails. Potresti fornire la tua opinione? Sono totalmente in errore e c'è un modo per fare facilmente qualsiasi cosa con un framework come Django o Rails o date le mie esigenze dovrei andare con qualcosa come web.py?

Grazie!

+0

"alla fine mi trovi in ​​difficoltà perché sarà limitato dal quadro"? Cosa pensi che succederà? Si prega di fornire un esempio o una citazione o un riferimento. Dopo tre anni di Django, non ho avuto un problema.Ma mi piacerebbe sapere cosa pensi che saranno i tuoi problemi. Si prega di fornire un esempio. –

+0

Hi S. Lott, Questo potrebbe essere molto ingenuo, ma ecco un esempio che stavo immaginando. Per quanto ne so, Django si affida naturalmente alla permanenza dei modelli nel database. Nei tuoi modelli definisci la mappatura e il resto avviene più o meno automaticamente. Alcuni degli oggetti dati nel mio sistema si adatteranno bene a questo, ma altri semplicemente non funzionano così. Finirò con uno strano ibrido di oggetto modello appropriato e chiamate SQL. Questo mi si riempie già come se stessi combattendo Django. – Alex

+0

Grazie a tutti per aver fornito risposte molto illuminanti. Dal momento che sembra che non ci sia una risposta giusta a questa domanda ho appena scelto una delle risposte più complete, non necessariamente la "giusta". – Alex

risposta

8

I framework Web tendono a ottimizzare la creazione di siti Web, semplificando la maggior parte dei casi di uso normale. Una volta che inizi a fare più cose "out of the box" con un framework, potresti scoprire che passi più tempo a lavorarci intorno, quindi lo salvi usandolo in primo luogo.

E 'difficile generalizzare qui (soprattutto perché ho davvero lavorato solo in modo approfondito con Django), quindi mi offrono alcuni consigli basati sulle mie esperienze in via di sviluppo un'API JSON utilizzando Django:

put Semplice , Non è consigliabile utilizzare Django per scrivere un'API REST. Nella mia esperienza personale, non ho davvero trovato nulla di cui valga la pena scrivere a casa. Non avevo bisogno del sistema di template di Django, quindi tutto quello di cui mi sono veramente servito sono stati l'invio dell'URL e l'ORM. Anche allora, ho dovuto fare alcuni hack per far sì che il dispatcher dell'URL facesse quello che volevo - se non avessi usato altre funzionalità sarebbe stato più veloce usare un sistema URL diverso, in effetti. Nel tuo caso, l'ORM di Django non sarebbe nemmeno adatto in quanto non supporta più database (a meno che tu non stia utilizzando 1.2 alphas ...). Composto che con la mancanza di Django di un buon segnale di avvio, e Django inizia a sembrare piuttosto male per il lavoro.

Se fossi nei tuoi panni, cercavo le librerie specifiche che facevano ciò di cui avevo bisogno (ORM, WSGI, ecc.) E le usavo, piuttosto che cercare di piegare e martellare Django in qualcosa che si adatta alle mie esigenze .

Su una nota completamente diversa, si potrebbe voler dare un'occhiata a Tornado come un possibile frontend HTTP. È semplice e veloce.

0

Sarai molto più limitato dalle capacità di te stesso rispetto a una comunità diversificata di sviluppatori che lavorano su un grande progetto per condividere tutte quelle parti comuni.

1

Rails è utile o meno come è necessario, nel complesso. Se è necessario caricare una raccolta con SQL diretto, è semplice. Se nella stessa linea si desidera utilizzare tutto il built-in ActiveRecord Fu, è possibile. Il routing RESTful è estremamente semplice, ma ancora una volta se il particolare aroma Rails di REST non soddisfa le tue esigenze, il routing è completamente configurabile. In un'app Rails è possibile utilizzare tanto o meno dei valori predefiniti come necessario, e la riconfigurazione è disponibile a tutti i livelli.

+0

Grazie. Lo capisco, ma se non sto usando gli aspetti più utili di Rails non sarei migliore con qualcosa come Sinatra come gli altri hanno suggerito? – Alex

+0

Non ho usato Sinatra, ma non ho sentito altro che buone cose a proposito di molti veterani di Rails. Immagino che la domanda sia quanto peserà la tua app. Se si tratta di un'app di grandi dimensioni con un sacco di logica DB/dominio, è possibile * volere * un framework leggermente più pesante di Rails nei momenti opportuni. Ma sinceramente il miglior consiglio che potrei dare sarebbe quello di sedermi con qualsiasi requisito di alto livello che hai e vedere come si mappano su ogni quadro e i punti di forza/debolezze di questi framework. Una cosa da considerare è che la curva di apprendimento di Rails è probabilmente più alta di quanto si pensi. Un sacco di dettagli. –

5

È ancora possibile utilizzare tutto il potenziale della lingua in questione, anche se si utilizza anche un framework. Un framework non è un fattore limitante, è fondamentalmente uno strumento per facilitare lo sviluppo di alcune parti della vostra applicazione. Django e rail, ad esempio, estrapolano alcune funzionalità del database, quindi dovrai solo preoccuparti degli oggetti del tuo modello. Ciò non significa che non puoi fare cose da solo ...

1

Se non stai usando il livello di presentazione di Rails, ti stai perdendo una parte enorme di esso. La funzionalità necessaria per eseguire il dump degli oggetti su json/xml è così piccola che gli unici veri vantaggi che si potrebbero trarre da esso sarebbero ActiveRecord e routing, e se non riesci a immaginare i tuoi dati che si adattano perfettamente a un modello, allora non lascia molto .

Penso che tu abbia davvero bisogno di una struttura minimalista per occuparsi di alcune delle basi. Qualcosa che ti fornisce alcune sottigliezze sulla gestione delle richieste/delle risposte e sul routing e si mette in mezzo. L'equivalente Python di qualcosa come Sinatra potrebbe essere il tuo vicolo. Io uso un framework simile in Scala chiamato Step per i servizi web basati su xml/json, in cui mi preoccupo delle prestazioni (e non c'è nessuna presentazione in corso).

Sto dando un'occhiata a web.py, sembra coprire un livello simile di funzionalità a Sinatra/Step. Ritengo che sia una direzione più appropriata rispetto ad alcuni dei più completi framework di funzionalità. Non mi pento della mia scelta di Step, il codice base è così comicamente piccolo che è impossibile non capirlo, e questo rende facile estendere leggermente se ne hai la necessità.

1

Ho usato Ruby/Rails per anni e, a differenza di quasi tutti gli altri linguaggi/framework che ho utilizzato (in quasi 15 anni di Java, PHP, ColdFusion, ASP, ecc. Ecc.) Si toglie di mezzo quando ne hai bisogno

Sembra che si possa beneficiare di una struttura "più leggera" come Sinatra, ma con l'imminente rilascio di Rails 3 i vantaggi stanno diventando meno pronunciati. Rails 3 rende tutto configurabile ... infatti, Rails ora sarà solo un particolare set di plugin ed estensioni su un nucleo infinitamente flessibile.

Sono interessato a questa affermazione:

"Il servizio potrà contare su un database tuttavia per alcune delle operazioni più importanti non c'è modo chiaro di persistente un 'oggetto del modello' direttamente in un tabella del database. "

Non sai cosa intendi con questa affermazione ... ad un certo punto hai qualcosa da inserire nel database, giusto?

Nella maggior parte delle applicazioni non banali raramente si ha un singolo modello legato alla fine di una richiesta ... si potrebbe effettivamente avere una rete di modelli piuttosto complessa che vengono restituiti o aggiornati.

Se si sta lavorando con JSON, suggerirei sicuramente di consultare un database come MongoDB. MongoDB si basa interamente sulla memorizzazione dei dati JSON e può quindi adattarsi perfettamente alla tua applicazione.

+0

Grazie Toby Hede! Per rispondere alla tua domanda alcune operazioni porteranno a una grande ristrutturazione dei dati nel database. Ciò sarebbe effettuato in modo più efficiente attraverso l'uso di una serie di query complicate presentate come una singola transazione piuttosto che modificare un numero di modelli e quindi persisterli. – Alex

+0

In questo caso, darei un'occhiata a qualcosa come MongoDB ... Mongo vede il mondo come una serie di documenti JSON che possono essere manipolati. Per inciso, Rails può ancora gestire query arbitrarie per i modelli. Presumo che anche Django possa. –

6

La maggior parte dei web siti saranno ben si adatta ai quadri ricchi come Rails o Django - ma si sta costruendo una rete di servizi , e che ha molto diversi compromessi.

Personalmente, preferisco usare molto quadri chiari per i servizi web: in Python, questo significa che si basano principalmente su WSGI (che è uno standard, non un quadro), con un minimo di componenti altamente modulari per fornire qualche piccolo extra che potrei avere bisogno a seconda dei dettagli dei servizi (WSGI è molto bravo a consentire la composizione modulare di bit e pezzi "middleware").

La mia raccolta preferita personale di componenti WSGI modulari è Werkzeug, con WebOb per oggetti di richiesta e risposta; se ho bisogno di modelli, in questi giorni, tendo ad andare con Django Templates, e se ho bisogno di un DB relazionale preferisco scrivere direttamente SQL (anche se SQLAlchemy ha i suoi punti di forza -!).

Ma la cosa interessante dell'utilizzo di componenti modulari piuttosto che di framework integrati è che è possibile modificare ognuna di queste scelte (e combinare a piacimento a seconda delle proprie esigenze, preferenze e gusti!) .

1

Hai scritto requisiti, hai scritto giù decisioni tecnologiche. È qualcosa di completamente diverso. Che cosa vuoi ottenere? Quindi potremmo essere in grado di aiutarti con come raggiungerli con lo.

0

dare una prova di Primavera 3.0: See this post

+0

Spring = java, amico ha chiesto di Python e Ruby, quindi presumo che sia interessato solo a loro. –

+0

Dude usa effettivamente "come" e "mi piace" per descrivere 2 framework web che usa ... non è sicuro che lo racchiuda in Python e ruby. Commento inutile comunque ... – Philippe

2

In media, il quadro web più completo e disponibile è, il più limitante è quando si tenta di fare le cose in un altro modo rispetto al modo in cui il web framework pensa sia Il modo giusto. Alcuni framework web cercano di essere molto utili e non restrittivi, e alcuni lo fanno meglio di altri.

E la raccomandazione generale c'è: Non combattere il quadro. Perderai. Quindi è importante scegliere un framework che ti aiuti con le cose che vuoi fare, ma non impone altro. Per il tuo caso webservice, questo non dovrebbe essere un problema. Ci sono tonnellate di strutture web minimaliste là fuori, almeno nel mondo Python (che è tutto ciò che mi interessa). Bobo, BFG, Piloni, Werkzeug, ecc. Ecc. Nessuno di questi ti metterà di mezzo.

Inoltre, non dimenticare che spesso possibile utilizzare diversi quadri insieme facendoli correre fianco a fianco. Soprattutto utilizzando tecniche come Dexterity/XDV. Plone.org per esempio è per lo più Plon (duh) un eccellente sistema di gestione dei contenuti, ma estremamente restrittivo se si vuole fare qualcos'altro. Quindi parte del sito è Trac, l'eccellente tracker dei bug di Python. È tutto integrato per sembrare uguale.

1

Se sai che non utilizzerai un ORM, o non creerai un'interfaccia utente, avrai eliminato il 90% circa di ciò che utilizzeresti per la prima volta una struttura di applicazioni web. Se si guarda il set di funzionalità di Django, per esempio: quali parti di che usereste per implementare un servizio web che non si poteva ottenere di utilizzare qualcosa di molto più semplice, come Werkzeug o CherryPy?

Le principali differenze tra la creazione di un servizio Web e la creazione di una vecchia scatola nera che richiede input e produce output sono i vari limiti tecnici imposti dall'API basata su HTTP, il problema dell'apolidia e il problema dell'idempotence. Un framework per applicazioni web ti darà un po 'di aiuto su questi problemi, ma non molto.

+0

Grazie Robert! Se capisco correttamente quello che tutti quelli che hanno risposto a questo thread stanno dicendo che la tua risposta riassume molto bene ciò che pensa la gente. – Alex

Problemi correlati