javascript - example - flask ajax
Flask url_for URLs en Javascript (7)
¿Cuál es la forma recomendada de crear URL dinámicas en archivos Javascript cuando se utiliza un matraz? En las plantillas de jinja2 y en las vistas de url_for
se usa url_for
, ¿cuál es la forma recomendada de hacerlo en los archivos .js
? Dado que no son interpretados por el motor de plantillas.
Lo que básicamente quiero hacer es:
// in comments.js
$.post(url_for(''comment.comment_reply''));
Lo cual no es posible
Pero, naturalmente, puedo ejecutar eso en una plantilla:
<script>
$.post(url_for(''comment.comment_reply''));
</script>
En mi caso, estaba tratando de crear URL dinámicamente
Resolví mi problema de la siguiente manera (Nota: he cambiado la sintaxis de Angular por {[x]}):
<ul>
<li ng-repeat="x in projects">
{[x.title]}
{% set url = url_for(''static'',filename="img/") %}
<img src="{{url}}{[x.img]}">
</li>
</ul>
Estaba buscando una solución, ellos vienen con esta solución donde
No se requiere add-on
Sin URL de codificación fija
La clave es darse cuenta de que Jinja2
tiene la capacidad de hacer javascript de la caja.
Configure su carpeta de plantilla a algo como a continuación:
/template
/html
/index.html
/js
/index.js
En tu views.py
@app.route("/index_js")
def index_js():
render_template("/js/index.js")
Ahora en lugar de servir el javascript desde su carpeta estática. Utilizarías:
<script src="{{ url_for(''index_js'') }}"></script>
Después de todo, está generando el javascript sobre la marcha, ya no es un archivo estático.
Ahora, dentro de su archivo javascript, simplemente use url_for
como lo haría en cualquier archivo html
.
Por ejemplo, usando Jquery
para hacer una solicitud de Ajax
$.ajax({
url: {{ url_for(''endpoint_to_resource'') }},
method: "GET",
success: call_back()
})
La documentación de Flask sugiere usar url_for
en su archivo HTML para establecer una variable que contenga la URL raíz a la que puede acceder en cualquier otro lugar. Luego, tendría que construir manualmente las URL de vista además de eso, aunque supongo que podría almacenarlas de manera similar a la URL raíz.
La respuesta de @Jeremy es correcta y probablemente sea el enfoque más común, pero como respuesta alternativa, tenga en cuenta que dantezhu
escribió y publicó una extensión de matraz que dice hacer la traducción exacta url-route-map-to-javascript sugerida en el comentario.
Lo que sugiere @ dumbmatter es considerado como una forma estándar de facto. Pero pensé que habría una mejor manera de hacerlo. Así que logré desarrollar este complemento: Flask-JSGlue .
Después de agregar {{ JSGlue.include() }}
, puede hacer lo siguiente en su código fuente:
<script>
$.post(Flask.url_for(''comment.comment_reply'', {article_id: 3}));
</script>
o:
<script>
location.href = Flask.url_for(''index'', {});
</script>
Sugiero esto:
<script src="{{ url_for(''static'', filename=''js/jquery.js'') }}" type="text/javascript">
</script>
Funciona bien para mí
Uso este sucio y feo truco:
"{{url_for(''mypage'', name=metadata.name,scale=93,group=2)}}"
.replace(''93/group'',scale+''/group'')
donde scale
es la variable javascript que quiero usar para una solicitud AJAX. Entonces, url_para generar una URL y JavaScript, reemplace el parámetro en tiempo de ejecución. El código generado es algo así como:
"/ajaxservive/mynam/scale/93/group/2".replace(''93/group'',scale+''/group'')
lo cual es bastante extraño, pero aún no puede encontrar soluciones más elegantes.
De hecho, mirando el código de la extensión del mazo enlazado, hace lo mismo pero administra el caso general.