2010-06-06 18 views
10

Ho notato tre modi principali per il trattamento delle richieste da parte dei framework Web Python: decoratori, classi controller con metodi per richieste individuali e classi di richieste con metodi GET/POST.Decoratori e classi nello sviluppo web Python

Sono curioso delle virtù di questi tre approcci. Ci sono grandi vantaggi o svantaggi in questi approcci? Per sistemare le idee, ecco tre esempi.

Bottle utilizza decoratori:

@route('/') 
def index(): 
    return 'Hello World!' 

Pylons utilizza le classi di controller:

class HelloController(BaseController): 
    def index(self): 
     return 'Hello World' 

Tornado utilizza le classi gestore della richiesta con i metodi per i tipi:

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.write("Hello, world") 

Quale stile è la migliore pratica ?

+0

Hai taggato con Django e non hai incluso un campione. Direi che Django è il framework web * Python, quindi sembra un po 'strano escluderlo anche se il suo approccio MVT è leggermente diverso dai modelli MVC standard. – Oli

+0

Django non è il tuo framework go-to per vedere le best practice di Python. –

+0

Forse no ma non sono sicuro che ci sia una cosa come una buona pratica a questo livello. – Oli

risposta

10

C'è in realtà una ragione per ciascuno dei tre metodi elencati, specifici per ciascun progetto.

  • bottiglia cerca di mantenere le cose come semplice/semplice possibile per il programmatore. Con i decoratori per i percorsi che non devi preoccuparti sullo sviluppatore che comprende OOP.
  • L'obiettivo di sviluppo dei piloni è rendere il codice riutilizzabile e facilmente integrato con il routing del processo HTTP di tipo WSGI. Come tale, hanno il scelto un modo molto OOP di organizzare i percorsi . Ad esempio, è possibile copiare & incollare HelloController in qualsiasi app per piloni e dovrebbe semplicemente funzionare magicamente. Anche se la suddetta app è servita su WSGI in alcuni modi complicati di .
  • Tornado ha ancora un altro motivo per fare le cose nel modo in cui funziona: del Tornado IOLoop a base epoll (in collaborazione con tornado.web.Application) un'istanza ogni RequestHandler come richieste entrano.Mantenendo ogni RequestHandler limitato a uno specifico GET o POST , questo consente a IOLoop di di istanziare rapidamente la classe, elabora la richiesta e, infine, di consentire a di raccogliere i dati inutili. Ciò mantiene veloce ed efficiente con un piccolo ingombro di memoria indipendentemente da come molti RequestHandlers dell'applicazione . Questo è anche il motivo per cui Tornado è in grado di gestire molte più richieste simultanee rispetto ad altri server Web basati su Python (ogni richiesta riceve la propria istanza).

Ora, avendo detto tutto ciò che dovresti sapere, puoi sempre ignorare il comportamento predefinito del framework. Ad esempio, ho scritto un MethodDispatcher per Tornado che lo rende più simile a Pylons (beh, avevo CherryPy in mente quando l'ho scritto). Rallenta una piccola quantità di Tornado (e aumenta leggermente l'ingombro della memoria) a causa dell'uso di un grande RequestHandler (rispetto a molti piccoli) ma può ridurre la quantità di codice nella tua app e renderla un po 'più facile da leggere (Nella mia opinione parziale, ovviamente =).

1

I vari framework stanno cercando di ottenere le migliori prestazioni attraverso il miglior codice (per scrivere e leggere). Ognuno di loro adotta strategie diverse basate su MVC o MVT.

Probabilmente ciò su cui ti stai concentrando sarà probabilmente il gusto personale. E così sarà la mia risposta. Sto tentando molto duramente di evitare qualsiasi tipo di guerra santa perché potrebbero esserci argomenti tecnici validi di cui non sono a conoscenza.

Ma I personalmente preferisco mantenere il routing separato dal controller (vista di Django) e il modello separato da quello. Rende il riutilizzo dei controller davvero semplice. Sì, sono un utente Django.

Come tale, io non sono un grande fan dei decoratori di Bottle o di confezionare oggetti in grandi e grandi classi di hulking. Ero abituato a quando ero uno sviluppatore ASP.NET ma Django mi ha reso libero.

+0

Sono d'accordo che è bello separare il routing dai controllori. Ciò rende possibile automatizzare il routing in base alle proprie preferenze. Non c'è la necessità esplicita di trovare sempre URL esatti. :) –