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í:
- Enlace a archivos estáticos Flask con url_para 1 respuesta
- Pase el parámetro con Python Flask en Javascript externo 2 respuestas
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.