Meu aplicativo faz uma chamada para uma API que retorna um dicionário. Quero passar informações deste ditado para JavaScript na exibição. Estou usando a API do Google Maps no JS, especificamente, então gostaria de passar uma lista de tuplas com as informações longas / latinas. Eu sei que render_template
essas variáveis serão passadas para a exibição para que possam ser usadas em HTML, mas como eu poderia passá-las para JavaScript no modelo?
from flask import Flask
from flask import render_template
app = Flask(__name__)
import foo_api
api = foo_api.API('API KEY')
@app.route('/')
def get_data():
events = api.call(get_event, arg0, arg1)
geocode = event['latitude'], event['longitude']
return render_template('get_data.html', geocode=geocode)
fonte
json
módulo para despejar seus dados na forma de um objeto JSONA maneira ideal de obter praticamente qualquer objeto Python em um objeto JavaScript é usar JSON. O JSON é ótimo como um formato para transferência entre sistemas, mas às vezes esquecemos que significa JavaScript Object Notation. Isso significa que injetar JSON no modelo é o mesmo que injetar código JavaScript que descreve o objeto.
O Flask fornece um filtro Jinja para isso:
tojson
despeja a estrutura em uma string JSON e a marca como segura, para que o Jinja não a escape automaticamente.Isso funciona para qualquer estrutura Python que seja JSON serializável:
fonte
Uncaught SyntaxError: Unexpected token &
no console javascript.TypeError: Object of type Undefined is not JSON serializable
O uso de um atributo de dados em um elemento HTML evita o uso de scripts embutidos, o que, por sua vez, significa que você pode usar regras mais rígidas de CSP para aumentar a segurança.
Especifique um atributo de dados da seguinte maneira:
Em seguida, acesse-o em um arquivo JavaScript estático, assim:
fonte
Como alternativa, você pode adicionar um ponto de extremidade para retornar sua variável:
Em seguida, faça um XHR para recuperá-lo:
fonte
Apenas outra solução alternativa para quem deseja passar variáveis para um script que é originado usando o balão, eu só consegui fazer isso definindo as variáveis fora e depois chamando o script da seguinte maneira:
Se eu inserir variáveis jinja,
test123.js
ele não funcionará e você receberá um erro.fonte
/static/test123.js
) que você está mal-entendido como<script>
s comsrc
s trabalho. Eles não são um recurso do Flask. O navegador , quando analisa esse script, faz uma solicitação HTTP separada para obter o script. O conteúdo do script não é inserido no modelo pelo Flask; de fato, o Flask provavelmente terminou de enviar o HTML de modelo para o navegador no momento em que o navegador solicita o script.As respostas de trabalho já foram fornecidas, mas quero adicionar uma verificação que atue como à prova de falhas, caso a variável do balão não esteja disponível. Quando você usa:
se houver um erro que faça com que a variável seja inexistente, os erros resultantes poderão produzir resultados inesperados. Para evitar isso:
fonte
Isso usa jinja2 para transformar a tupla de geocódigo em uma string json e, em seguida, o javascript
JSON.parse
transforma isso em uma matriz javascript.fonte
Bem, eu tenho um método complicado para este trabalho. A ideia é a seguinte:
Faça algumas tags HTML invisíveis como
<label>, <p>, <input>
etc. no corpo HTML e faça um padrão no ID da tag, por exemplo, use o índice de lista na ID da tag e o valor da lista no nome da classe da tag.Aqui eu tenho duas listas maintenance_next [] e maintenance_block_time [] do mesmo comprimento. Quero passar esses dados da lista para javascript usando o balão. Então, pego uma etiqueta de etiqueta invisível e defino seu nome de tag como um padrão de índice de lista e defino seu nome de classe como valor no índice.
Depois disso, recupero os dados em javascript usando alguma operação javascript simples.
fonte
Alguns arquivos js vêm da web ou da biblioteca e não são escritos por você. O código que eles obtêm variável assim:
Este método mantém os arquivos js inalterados (mantém a independência) e passa a variável corretamente!
fonte