2009-12-27 8 views
14

Ho una domanda su come dividere un file main.py.Google App Engine - Come posso suddividere il codice in più file? (webapp)

in questo momento, ho tutto nel mio main.py.py. Non ho altri file .py. E devo sempre scorrere lunghe righe di codice prima di raggiungere la sezione che desidero modificare.

Come dividerlo? (ho intenzione di avere più di 20 pagine, in modo che significa l'main.py sarà enorme se non dividerlo

PS:. Inoltre, ho notato che ho dovuto impostare i valori del modello , percorso del modello, e chiamare template.render ogni volta Qualsiasi modo di tutti accorciare

Codice:.?

# everything here in main.py 
class MainPage(webapp.RequestHandler): 
    def get(self): 
     # Models are queried here, results transferred to template_values 

     template_values = { 
      'value1': value1, 
      'value2': value2, 
      'value3': value3, 
      } 

     path = os.path.join(os.path.dirname(__file__), 'index.html') 
     self.response.out.write(template.render(path, template_values)) 

class Page2(webapp.RequestHandler): 
    def get(self): 
     # Models are queried here, results transferred to template_values 

     template_values = { 
      'value1': value1, 
      'value2': value2, 
      'value3': value3, 
      } 

     path = os.path.join(os.path.dirname(__file__), 'index.html') 
     self.response.out.write(template.render(path, template_values)) 

class Page3(webapp.RequestHandler): 
    def get(self): 
     # Models are queried here, results transferred to template_values 

     template_values = { 
      'value1': value1, 
      'value2': value2, 
      'value3': value3, 
      } 

     path = os.path.join(os.path.dirname(__file__), 'index.html') 
     self.response.out.write(template.render(path, template_values)) 


application = webapp.WSGIApplication(
            [('/', MainPage), 
             ('/page2', Page2) 
             ('/page3', Page3)], 
            debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == "__main__": 
    main() 
+0

mossa HTTP gET di nuovo e mantenere i messaggi è la mia strategia in quanto la maggior parte dei messaggi sono crucials e già lavorano. –

risposta

22

La divisione del codice non è diff erent rispetto alla suddivisione del codice per qualsiasi app Python: trovare un gruppo di codice correlato che si desidera spostare in un altro file, spostarlo in quel file e importarlo nel file del gestore principale.

Ad esempio, è possibile spostare il codice Pagina2 a page2.py, mettere

import page2 

nella parte superiore del file, e cambiare la mappatura per caricare /page2 da page2.Page2 (si potrebbe desiderare di rinominare queste classi in questo caso ...

in alternativa, si potrebbe avere file .py separati gestire diversi (gruppi di) pagine modificando il file app.yaml come descritto nella Script Handlers.

Puoi avvolgere il codice di gestione dei modelli in una comoda funzione e chiamarlo, per ridurre un po 'il codice ripetuto. Si può essere in grado di semplificare il caricamento dei valori di modello, ma una volta che si desidera eseguire il rendering, si potrebbe chiamare un metodo simile

def render(template_file, template_values): 
    path = os.path.join(os.path.dirname(__file__), template_file) 
    self.response.out.write(template.render(path, template_values)) 

Non è molto di un risparmio, ma è un po 'più leggibile. Probabilmente vorresti spostare render in un altro file e import dove lo vuoi.

2

Definire le classi in altri file .py e utilizzare "importazione" per usarli nella vostra main.py. In realtà è abbastanza semplice.

0

thx per l'input, li apprezzo molto.

come per raggruppare le importazioni insieme, ho cercato di mantenere tutte le app-motore importazioni legate in un file .py chiamato ext.py

poi ho chiamato ovunque ho voluto usarlo da questa linea:

from ext import * 

ext.py contiene i seguenti:

import os 

# import from appengine's libs 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp.util import run_wsgi_app 
from google.appengine.ext.webapp import template 
from google.appengine.ext import db 

# import models 
from models import * 
+0

Ho notato che quando ho separato la classe Page2 da main.py, dovevo ancora importare le librerie appengine nella parte superiore del file page2.py. È una specie di ridondante. Eventuali suggerimenti? – fooyee

+0

Questa dovrebbe probabilmente essere una domanda a parte, dato che stiamo davvero comprando molte informazioni in questo momento, ma ... Una risposta sarebbe creare variabili est che rispecchino le tue importazioni. La formattazione sarà male qui, ma qualcosa del tipo: 'import google.appengine.ext.webapp; webapp = google.appengine.ext.webapp' Quindi quando gli altri moduli importano ext, possono fare riferimento a ext.webapp (o usare 'da ext import' per parlare solo di webapp). –