2009-12-27 19 views
14

Tengo una pregunta sobre la división de un archivo main.py.Google App Engine: ¿cómo puedo dividir el código en varios archivos? (aplicación web)

en este momento, tengo todo en mi main.py. No tengo otros archivos .py. Y siempre tengo que desplazarme por largas líneas de código antes de llegar a la sección que deseo editar.

¿Cómo lo divido? (voy a tener más de 20 páginas, por lo que significa que main.py será ENORME si no lo divido.

PD: también noté que tenía que configurar los valores de la plantilla , ruta de plantilla, y llamar cada vez template.render Cualquier forma de acortar a todos

Código:.?

# 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

movimiento HTTP GET a nuevo y mantener puestos es mi estrategia ya que la mayoría de los mensajes son cruciales y que ya funcionan. –

Respuesta

22

Dividir el código no es diff Además de dividir el código para cualquier aplicación de Python: encuentre un grupo de código relacionado que desee mover a otro archivo, muévalo a ese archivo e impórtelo en el archivo del controlador principal.

Por ejemplo, se puede mover el código Página2 a page2.py, puesto

import page2 

en la parte superior de su archivo y cambie la asignación de la carga de /page2page2.Page2 (es posible que desee cambiar el nombre de estas clases en este caso ...

como alternativa, puede tener archivos .py separados manejan diferentes (grupos de) páginas editando el archivo app.yaml como se describe en Script Handlers.

Puede envolver el código de manejo de la plantilla en una función de conveniencia y llamarlo para reducir un poco el código repetido. Usted puede ser capaz de simplificar la carga de los valores de la plantilla, pero una vez que desea representar, se podría llamar un método algo así como

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)) 

No es mucho de un ahorro, pero es un poco más fácil de leer. Probablemente desee mover render a un archivo diferente y import donde lo desee.

2

Definir sus clases en otros archivos .py y el uso de "importación" para utilizarlos en su main.py Es bastante simple en realidad.

0

thx para la entrada, realmente los aprecio.

como para agrupar las importaciones juntos, he tratado de mantener toda la app-engine importaciones relacionadas en un archivo .py llamada ext.py

Entonces me llamaron en cualquier lugar que quería utilizar por esta línea:

from ext import * 

ext.py contiene los siguientes:

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

Noté que cuando había separado la clase Page2 de main.py, todavía tenía que importar las librerías appengine en la parte superior del archivo page2.py. Es un poco redundante. ¿Alguna sugerencia? – fooyee

+0

Esto probablemente debería ser una pregunta separada, ya que estamos empaquetando mucha información en este ahora, pero ... Una respuesta sería crear variables en ext que reflejen sus importaciones. El formato será malo aquí, pero algo como: 'import google.appengine.ext.webapp; webapp = google.appengine.ext.webapp' Luego, cuando sus otros módulos importan ext, pueden referirse a ext.webapp (o usar 'from ext import' para simplemente hablar de webapp). –