2016-05-16 12 views
5

Ho esaminato forum simili ma non sono riuscito a far funzionare nessuna delle soluzioni. Sto cercando di passare le variabili dalla fiaschetta al mio file di script java. Questi valori verranno quindi utilizzati per PubNub dal mio file javascript.Passaggio di variabili da pallone a javascript

Ecco parte del mio codice Python:

@app.route("/mysettings/") 
def user_settings(): 
     return render_template('Settings.html', project_name = session['project_name'] , publish_key = session['publish_key'] , subscribe_key = session['subscribe_key']) 

Qui fa parte del mio codice javascript (app.js):

var settings = { 
     channel: {{project_name}}, 
     publish_key: {{publish_key}}, 
     subscribe_key: {{subscribe_key}} 
    }; 

questo codice funziona se lo uso nel mio Impostazioni. file html ma non nel file app.js.

risposta

10

Le risposte mobiusklein sono piuttosto buone, ma è necessario "mod". Definisci il tuo metodo Javascript per ricevere parametri e inviare dati come parametri alla tua funzione.

main.py

@app.route('/') 
def hello(): 
    data = {'username': 'Pang', 'site': 'stackoverflow.com'} 
    return render_template('settings.html', data=data) 

app.js

function myFunc(vars) { 
    return vars 
} 

settings.html

<html> 
    <head> 
     <script type="text/javascript" {{ url_for('static', filename='app.js')}}></script> 
     <script type="text/javascript"> 
      myVar = myFunc({{vars|tojson}}) 
     </script> 
    </head> 
</html> 
+1

Questo sembra normale per me, non è un hack. –

+1

vars/tojson: questo mi ha salvato la vita in quanto sviluppatore non web: D Grazie – Oxydron

1

Il motivo è che jinja2 deve essere utilizzato per eseguire la sostituzione, che dal codice non sembra avvenire.

Le probabilità sono che stai servendo app.js come un file statico, il che significa che non viene mai guardato dal macchinario del motore dei modelli, appena servito così com'è.

È possibile realizzare quello che stai descrivendo servendo app.js da un URL che è legato a un'azione che passa il contenuto del app.js attraverso la funzione di Flask render_template, eseguendo jinja2 sostituzioni, e tutte le altre informazioni di personalizzazione, ma questo significa jinja2 deve analizzare l'intero file, che può essere costoso.

Si potrebbe provare a passare tali variabili utilizzando una richiesta AJAX a cui risponde un'azione che restituisce gli stessi dati in JSON. Questa è una pratica molto più comune e ha il valore aggiunto di rendere tali dati visibili ad altre risorse.

6

modo semplice per passare variabili dalla visualizzazione di una maschera al modello in un file javascript con un semplice esempio citato da @mauro.

main.py

@app.route('/') 
def hello(): 
    data = {'username': 'Pang', 'site': 'stackoverflow.com'} 
    return render_template('settings.html', data=data) 

settings.html

<html> 
    <head> 
     <script type="text/javascript"> 
      var username = {{ data.username }} 
      var site = {{ data.site }} 
     </script> 
     <script type="text/javascript" src="app.js"></script> 
    </head> 
</html> 

app.js

function myFunc() { 
    return username + site 
} 
+1

Questa risposta ha funzionato per me solo dopo aver modificato 'data.username' in 'data.username | tojson' (sto passando alla variabile il cui nome contiene barre) , ad esempio "/ esempio/nome" se questo è importante.) – Sam