Pregunta

Así que hice las aplicaciones triviales de "calentamiento" con GAE.Ahora me gustaría crear algo con una estructura de directorios más compleja.Algo parecido a:

siteroot/
    models/
    controllers/
        controller1/
        controller2/
        ...
    templates/
        template1/
        template2/
        ...

..etc.Los controladores serán módulos de Python que manejan solicitudes.Luego necesitarían ubicar plantillas (estilo Django) en carpetas asociadas.La mayoría de las aplicaciones de demostración que he visto resuelven rutas de plantilla como esta:

path = os.path.join(os.path.dirname(__file__), 'myPage.html')

...la propiedad __ file __ se resuelve en el script que se está ejecutando actualmente.Entonces, en mi ejemplo anterior, si se estuviera ejecutando un script de Python en controladores/controlador1/, entonces 'miPágina.html' se resolvería en ese mismo directorio (controladores/controlador1/miPágina.html) y preferiría separar limpiamente mis archivos. Código Python y plantillas.

La solución que he ideado juntos se siente...hacky:

base_paths = os.path.split(os.path.dirname(__file__))
template_dir = os.path.join(base_paths[0], "templates")

Entonces, simplemente estoy recortando el último elemento de la ruta del script que se está ejecutando actualmente y agregando el directorio de la plantilla a la nueva ruta.Las otras soluciones (no específicas de GAE) que he visto para resolver rutas de Python parecen bastante pesadas (como dividir rutas en listas y manipularlas en consecuencia).Django parece tener una respuesta para esto, pero prefiero ceñirme a la API GAE, vs.creando una aplicación Django completa y modificándola para GAE.

Supongo que cualquier cosa codificada no sería inicial, ya que las aplicaciones se encuentran en la infinita granja de servidores de Google.Entonces, ¿cuál es una mejor manera?

¿Fue útil?

Solución

No puedes usar rutas relativas, como sugiere Toni, porque no tienes garantía de que la ruta desde tu directorio de trabajo hasta el directorio de tu aplicación seguirá siendo la misma.

La solución correcta es usar os.path.split, como está, o usar algo como:

path = os.path.join(os.path.dirname(__file__), '..', 'templates', 'myPage.html')

Mi enfoque habitual es generar una ruta al directorio de la plantilla usando el método anterior, almacenarla como miembro de mi objeto controlador y proporcionar un método "getTemplatePath" que toma el nombre de archivo proporcionado y lo une con el nombre base.

Otros consejos

El dirname La función devuelve una ruta absoluta, use rutas relativas.Vea cuál es el directorio actual cuando se ejecutan sus controladores os.path.abspath(os.path.curdir) y construir una ruta a las plantillas relativas a esa ubicación (sin el os.path.abspath parte por supuesto).

Esto sólo funcionará si el directorio actual está en algún lugar dentro raíz del sitio, de lo contrario podrías hacer algo como esto:

template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top