2013-11-25 32 views
8

Il mio obiettivo qui è di richiedere all'utente di compilare un modulo, inviare tali informazioni in una richiesta POST al server del pallone, quindi eseguire il rendering di un modello utilizzando tali informazioni del modulo (dopo averne subito alcune logica sul server).Fare un POST AJAX seguito da GET con Flask

Finora, ho completato la parte POST di tutto questo. Sto cercando di renderizzare un modello proprio ora all'interno del if request.method == POST', e suppongo che non funzioni proprio adesso.

Ecco il codice che ho finora:

@app.route('/filteredsearch/', methods = ["GET", "POST"]) 
def filteredsearch(): 
    if request.method == 'POST': 
     data = json.loads(request.data) 
     tables = data['checkboxes'] 
     filter_results = getFilteredEntities(tables = tables) 
     print filter_results       #This works 
     return render_template("filteredsearch.html", entities = filter_results) 

Devo fare un GET richiesta separata sul successo della mia funzione POST? Se sì, come lo farei?

Qui è la richiesta AJAX (se è importante, questo codice può essere chiamato su ogni singola pagina del app):

$.ajax({ 
       url:"/filteredsearch/", 
       type: 'POST', 
       data: json, 
       contentType: 'application/json;charset=UTF-8', 
       success: function() { 
          alert("Done"); 
         } 
      }); 

Così, idealmente posso rendere un template, mentre io sto postando. Se questo non è il caso, come faccio a fare una richiesta GET dalla stessa funzione ajax?

So che in genere si utilizza url_for() per una richiesta GET, è un'opzione data che sono in JS a questo punto?

risposta

3

Normalmente si utilizza una richiesta AJAX per restituire i dati che poi visualizzare dinamicamente nella pagina.

$.ajax({ 
    url:"/filteredsearch/", 
     type: 'POST', 
     data: json, 
     contentType: 'application/json;charset=UTF-8', 
     success: function(evt) { 
      $("#results").html = evt.data; 
     } 
}); 

Se avete intenzione di reindirizzare ad un altro modello, allora perché non basta fare clic su Invia in un modulo che fa un post e poi risponde con il nuovo modello. Se realtà desidera reindirizzare a tutta una nuova pagina dopo che la richiesta Ajax è tornato (che sta per essere più lento che visualizzare le informazioni che hai già ricevuto) allora si potrebbe cambiare il window.location. Qualcosa come window.location = 'http://www.example.com' porterebbe l'utente a esempio.com.

+0

questa è una cosa pallone che ho perso? Ho bisogno di compilare il nuovo modello con una variabile (chiamata 'filtro_results' sopra). È una possibilità con il metodo che stai descrivendo? –

+0

Non proprio. Questa è una cosa di sviluppo web. Se vuoi solo fare una richiesta di post e poi rispondere con un modello renderizzato, non farlo come una richiesta AJAX. Basta usare un modulo html con un pulsante di invio. http://www.w3schools.com/html/html_forms.asp – aychedee

+0

Ma ho bisogno di fare lavoro sul lato server. Non significa che ho bisogno di usare AJAX –

1

so che è un po 'tardi, ma ho appena avuto lo stesso problema di te.

avevo bisogno di fare un post con l'Ajax e poi se è riuscito avevo bisogno di fare una richiesta GET a pallone per restituire un modello reso. Qualcosa di simile:

BOCCETTA PARTE:

@app.route('/something', methods=['POST']) 
def something_post(): 
    # Get JSON object passed with Ajax request 
    elems = request.json 
    # Do stuff 
    # If everithing is OK, return success message 
    return json.dumps({'success': True}), 200, {'ContentType': 'application/json'} 

@app.route('/something', methods=['GET']) 
def something_get(): 
    # Return template 
    return render_template('something.html') 

AJAX PARTE:

$.ajax({ 
     type: 'POST', 
     data: myJsonString, // JASON object passed to flask 
     url: '/something', 
     contentType: "application/json", 
     method: 'POST', 
     success: function(response) { 
      # If we succed we make a request to get the template 
      window.location.href = "/something"; 
      # With this line we are making a simple GET request to Flask and the template returned is opened in the current window 
     } 
}); 

prega, nota che sono lontano, lontano da essere un esperto Ajax. Non so se questo è il modo corretto per farlo, ma è stato il modo più semplice che ho trovato.

+0

Funziona perfettamente. Ty – Leustad