sitio serve img files estáticos configurar carga archivos python flask jinja2 template-engine

python - serve - Importar archivos javascript con jinja desde la carpeta estática



img django (3)

Dada una estructura de directorio de ejemplo que se parece a esto

app/static/css/bootstrap.min.css app/static/js/bootstrap.min.js app/templates/test_page.html app/views run_server

Puede configurar el matraz static_url_path cuando crea el objeto de la aplicación

app = Flask(__name__, static_url_path=''/static'')

y luego en test_page.html puedes tener algo que se parece a esto

<link href="{{ url_for(''static'', filename=''css/bootstrap.min.css'') }}" rel="stylesheet"> I''m an html body <script src="{{ url_for(''static'', filename=''js/bootstrap.min.js'') }}"></script>

Esta pregunta ya tiene una respuesta aquí:

Necesito tener acceso a la plantilla de jinja en los archivos javascript (debido a las etiquetas i18n). Así que la forma en que encontré es simplemente cargar el archivo js con include, del método jinja. {% include "file.js" %}

Sin embargo, este método buscará archivos solo en la carpeta de plantillas. Pero los archivos js deben estar en la carpeta estática. Mi pregunta es, ¿cómo puedo cambiar la forma en que Jinja busca los archivos? En lugar de buscar en la carpeta de plantillas, en este caso, busque en la carpeta estática.

{% block javascript %} <script type="text/javascript"> {% include "myscript.js" %} </script> {% endblock %}


Puede crear y registrar una función global solo haciendo eso:

import os app = Flask(__name__.split(''.'')[0]) @app.template_global() def static_include(filename): fullpath = os.path.join(app.static_folder, filename) with open(fullpath, ''r'') as f: return f.read()

Y luego puede incluirlo así (el filtro safe evita que las comillas comiencen a escaparse):

{% block javascript %} <script type="text/javascript"> {{ static_include("myscript.js") | safe }} </script> {% endblock %}


Si necesita tratar un archivo como una plantilla, entonces no es estático. Ponlo en la carpeta de plantillas y renderízalo. Si el archivo no es dinámico, entonces es estático. Póngalo en la carpeta estática y enlace a él. No es necesario que un tipo determinado de archivo deba ser una plantilla o un archivo estático. Elija cualquiera que sea necesario.

Por otro lado, probablemente sea mejor mantener JS estático y pasarle argumentos, en lugar de generar código diferente basado en diferentes entradas.