Necesito empaquetar la plantilla jinja2 para python

(ACTUALIZACIÓN: He hecho una mejor pregunta con una mejor respuesta aquí . Iba a eliminar esta pregunta, pero algunas de las respuestas podrían ser útiles para futuros buscadores).

Mi pregunta es casi idéntica a esta , pero esa respuesta es fea (requiere una estructura dir, que incluye las sharedtemplates/templates/templates/ ), incompleta como publicada (el usuario “respondió” su propia pregunta), y supone que tengo algunos conocimientos que no tengo. .

Estoy trabajando en mi primera aplicación web respaldada por Python. El componente javascript está en desarrollo utilizando una página HTML estática. Ahora quiero un componente Python del lado del servidor para manejar las llamadas AJAX y renderizar una plantilla HTML usando jinja2.

He tenido éxito con python anteriormente, creando aplicaciones GUI usando tkinter / request. Me encanta el idioma, pero el entorno de Python (¿entornos?) Es confuso. No estoy trabajando en un virtualenv .

De acuerdo con los documentos de jinja2 , las plantillas HTML tienen que estar en algo llamado paquete. Luego crea un Environment con un PackageLoader que conoce el nombre del paquete y la plantilla dir:

 from jinja2 import Environment, PackageLoader env = Environment(loader=PackageLoader('yourapplication', 'templates')) 

Entonces, aquí está mi index.py (es solo un código auxiliar y ni siquiera intenta renderizar nada, pero al menos puedes decir si se bloquea).

 #!/usr/bin/python from jinja2 import Environment, PackageLoader # no prob, jinja2 correctly installed using pip env = Environment(loader=PackageLoader('mypkg', 'template')) # causes server error # if it doesn't crash, just put up a basic html page for now print ("Content-type: text/html\r\n\r\n") print("hellohello wuld") 

Aquí está la estructura del directorio:

 index.py mypkg/ mypkg/template/index.html mypkg/__init__.py # empty 

Línea relevante del registro de errores:

 ImportError: No module named mypkg 

Tal vez necesito estructurar esto de manera diferente, y estoy bastante seguro de que necesitaré crear e invocar un setup.py para instalar el módulo. Eso es parte de lo que la otra respuesta dejó de lado: ¿qué hay en setup.py y cómo funciona en este caso? He visto docenas de recursos en setup.py y ninguno de ellos parece estar relacionado con la cuestión de instalar plantillas HTML.

¡Gracias de antemano por tu ayuda!

ACTUALIZACIÓN: fragilewindows señaló un recurso que informa sobre el “modo de desarrollador”, que probablemente sea parte de la respuesta. La dificultad aquí es que estoy buscando empaquetar esta plantilla para la implementación local, no para la distribución. Pero el 99% de la documentación en línea trata sobre proyectos de empaquetado para PyPi. No necesito empaquetar un “proyecto”, solo una plantilla HTML pequeña. De hecho, la única razón por la que necesito empaquetar la plantilla es porque esa es la forma predeterminada para que jinja2 acceda a las plantillas (y quiero que sea nativo en Python).

Solo necesito convencer al entorno de que “mypkg” está instalado y que “plantilla” es un directorio dentro de la instalación. Puedes ver que mis esfuerzos hasta ahora son ingenuos; Espero que la respuesta correcta sea correspondientemente liviana.

He descubierto una solución de trabajo, aquí . En este uso, la plantilla no forma parte de un módulo o paquete; se carga directamente desde el sistema de archivos. Sistema de archivos:

 ./index.py ./template.html 

index.py:

 #!/usr/bin/python import jinja2 templateLoader = jinja2.FileSystemLoader( searchpath="." ) templateEnv = jinja2.Environment( loader=templateLoader ) TEMPLATE_FILE = "template.html" template = templateEnv.get_template( TEMPLATE_FILE ) outputText = template.render( ) # this is where to put args to the template renderer print ("Content-type: text/html\r\n\r\n") print(outputText) 

No conozco el proceso involucrado con el empaquetado, pero creo que como Jinja2 está escrito en Python, el proceso sería el mismo que empaquetar cualquier otra aplicación en Python.

Aquí hay algunos enlaces que pueden ser útiles para usted:

  • La Guía del autostopista a Python (gran recurso): Explicación del empaque
  • Alternativas al Empaque: congela tu aplicación
  • Guía del usuario de Python Packaging (probablemente sea la más útil para usted)

Espero que esto ayude.

Tal vez un problema está en PYTHONPATH. De acuerdo con la documentación de Python https://docs.python.org/2.7/tutorial/modules.html#the-module-search-path busca módulos en:

  • el directorio que contiene el script de entrada (o el directorio actual).
  • PYTHONPATH (una lista de nombres de directorio, con la misma syntax que la variable de shell PATH).
  • el predeterminado dependiente de la instalación.

Puede agregar algo de código a su aplicación: imprima la variable sys.path para asegurarse de que la ruta de su aplicación también esté allí.

 import sys from jinja2 import Environment, PackageLoader # no prob, jinja2 correctly installed using pip print sys.path # printing your sys.path env = Environment(loader=PackageLoader('mypkg', 'template')) # causes server error 

Si no lo es, puedes agregar por

 sys.path.append(path_to_your_application)