Usando URLs externas en TEMPLATE_DIRS de Django

TEMPLATE_DIRS de Django en Settings.py requiere barras diagonales de estilo Unix.

Por eso, cuando llamo

get_template('some/template.html') 

en una vista, el resultado siempre comienza en la raíz y da como resultado una llamada a

 /home/username/projectname/public/some/template.html 

El problema es que me gustaría usar plantillas alojadas en un sitio completamente diferente. Esto funciona bien para otros campos de Settings.py (MEDIA_URL y STATIC_URL), donde tomará una ruta de acceso HTTP absoluta sin objeción.

Dada una ruta http,

  TEMPLATE_DIRS ('http://example.com/',) 

en Settings.py forzará

 get_template('some/template.html') 

en una vista para tratar de encontrar

 /home/username/projectname/public/http://example.com/some/template.html 

He tratado de sortear esto como tal

 TEMPLATE_DIRS ('../../../../http://example.com/',) 

Pero todavía obliga a una barra oblicua principal, así que obtengo “/http://example.com”, que es inútil.

Mis preguntas:

  1. ¿Hay alguna manera de engañar a esto para que extraiga los archivos de plantilla de otro servidor?
  2. ¿Es eso incluso factible, dado que los archivos de plantilla deben procesarse para la vista?
  3. ¿Es posible crear una alternativa a ‘django.template.loaders.filesystem.Loader’ que no requiera barras de estilo Unix?

No es necesario utilizar el directorio de plantillas si no desea hacerlo. Si tiene un servidor que sirve archivos de plantilla, simplemente puede buscarlos de forma remota utilizando urllib2 y crear y representar la plantilla con un contexto manualmente:

 import urllib2 from django.template import Context, Template tpl_html = urllib2.urlopen("http://mysite.com") tpl = Template(tpl_html) return tpl.render(Context({ 'some_variable' : 'some_val', }) 

Si va a hacer esto, debe incorporar algo de caché, ya que para cada solicitud de uso de esta plantilla, debe realizar una solicitud externa. Alternativamente, puede escribir esto en un cargador personalizado pero sufrirá las mismas limitaciones.

No puedes hacer esto.

No tiene nada que ver con nombres de ruta. Es solo que el cargador de plantillas del sistema de archivos necesita cargar cosas desde el sistema de archivos, de ahí el nombre.

Esto es completamente diferente del caso de MEDIA_URL: simplemente agrega una ruta a su HTML, que luego carga su navegador. A Django no le importa dónde vive ese archivo: aunque, de hecho, se aplica lo contrario, ya que si le pasas una ruta de acceso que no es una URL (es decir, que está servida por un servidor web en algún lugar), simplemente no funcionará.

Ahora, podría escribir un cargador de plantillas que obtenga sus plantillas de otro servidor. Los cargadores de plantillas son conectables: solo necesita poner el nombre de su nuevo cargador en la configuración TEMPLATE_LOADERS. El cargador en sí tendría que usar algo como urllib.urlopen para obtener la plantilla del servidor externo.

Pero piensa con mucho cuidado antes de hacer esto. Esto significa que cada solicitud de plantilla única ahora requiere una llamada a un servidor externo antes de que pueda servir la página. En el caso típico de una plantilla que extiende otras plantillas e incluye llamadas a tags de plantilla incluidas, podrían ser cinco o diez llamadas. Y, a diferencia de los archivos multimedia, no se puede hacer en paralelo: la página simplemente no se servirá hasta que todo el proceso haya finalizado. Es probable que esto haga que su servidor web sea muy lento.

No sé por qué crees que necesitas hacer esto. Las plantillas son parte de su código de aplicación, por lo que normalmente vivirían en el mismo servidor que su código Python. Si realmente tiene alguna razón para mantenerlos externamente, una solución podría ser montar el sistema de archivos externo en su servidor web a través de algo como sshfs . Sin embargo, todavía es probable que sea muy lento. Piensa otra vez.

  1. No, no es posible engañarlo para que extraiga archivos de otro servidor a través de http
  2. Sí, puedes subclasificar django.template.loaders.filesystem.Loader (y al modificar el método load_template_source de manera apropiada) para que puedas cargar plantillas a través de http

Una vez que haya hecho 3, entonces la respuesta a 2 sería sí, sería factible, en última instancia, al lenguaje de la plantilla de Django no le importa de dónde obtiene el archivo, siempre que esté en el formato correcto.

Sin embargo, parece ser una forma muy ineficiente de cargar plantillas y es más probable que haya una forma mucho mejor de lograr el mismo resultado.