2013-06-18 15 views
6

Wysyłam dane z formularza za pomocą jQuery $ .post() do funkcji kolby. Funkcja wykonuje pewne długie obliczenia danych. W takim przypadku nie chcę wysyłać kodu HTML, ale renderować nowy szablon. Jak mogę to zrobić, gdy wywołuję funkcję z jQuery/AJAX?

Postać:

<form id='myform'> 
    <input type='text'> some input... 
    <input type='button' value='send form' id='mybutton'> 
</form> 

Obliczanie na wejściu formy zajmuje trochę czasu, więc wyślę go z jQuery:

$.("#mybutton").click(function() { 
    // get the data in form 
    $exampledata = 'foo' 
    $.post("/some/flask/function", {'data': $exampledata}, function(response) { 
     can I render a new template here with data from flask function? 
    }); 
}); 

W kolbie, odpowiednia funkcja wygląda tak:

@app.route('/some/flask/function', methods=['POST']) 
def longCalculation():   
    form = request.form 
    data = form['data'] 

    result = runTheLongCalculation(data) 
    this does not work --> 
    return render_template('result.html',r=result) 
    how can I render a new template after an jQuery/AJAX call? 

Nie chcę odsyłać przekierowania i JSON-a, ale faktycznie renderować szablon.

Odpowiedz

4

Jeśli szablon renderowania jest po prostu kawałek HTML, można go zwrócić się jak wykazano w kodzie kolby i wykonaj następujące czynności w przeglądarce:

$.("#mybutton").click(function() { 
    // get the data in form 
    $exampledata = 'foo' 
    $.post("/some/flask/function", {'data': $exampledata}, function(response) { 
     var myDiv = $('#resultarea'); // The place where you want to inser the template 
     myDiv.html(response); 
    }); 
}); 

Ten oczekuje szablon Kolby wyglądać coś takiego:

<div id='result'> 
    {{ result }} 
</div> 

to może być większy, ale jesteśmy wkładając ją wewnątrz strony tak nie Paski, nawigacji menu lub html/tagów ciała, tylko prosty kawałek kodu HTML.

Problem pojawia się, jeśli odeślesz w pełni rozwiniętą stronę HTML za pomocą funkcji Flask, ponieważ nie będzie ona poprawnie renderowana na istniejącej stronie.

+0

To zadziała. Problem polega na tym, że "wynik" jest duży i złożony. Łatwo jest umieścić go w tabeli z szablonem. Ale nie byłoby dobrze skompilować długie wyjście HTML w funkcji Python/flask ... –

+0

Bardziej ogólne: Czy masz pomysł na temat najlepszego sposobu na zapisanie (dużo) danych wygenerowanych po żądaniu AJAX i uzyskanie dostępu do niego z poziomu następne żądanie (np. proste window.location.replace() w wywołaniu zwrotnym $ .post). –

+2

Mówiąc ogólniej, możesz go obliczyć/wygenerować dane, zapisać lokalnie (po stronie serwera, do jakiegoś tymczasowego sklepu, np. Memcached lub redis, a nawet na dysku) i przekierować na inną stronę z określonym parametrem (identyfikator lub podobne dla obliczenia), które następnie pokazują wynik jako normalną stronę internetową. Jednak nie ma nic złego w wysyłaniu dużej ilości danych za pośrednictwem wywołania AJAX - dla wszystkich celów i celów działa tak samo jak "normalne" żądanie HTTP. –

1

Po wypróbowaniu wiele sposobów, aby to zrobić:

Myślę, że najlepszym sposobem, aby przesłać dane z długim biegu obliczeń po stronie serwera do nowej strony jest użycie jakiegoś rodzaju składowania po stronie serwera. W ten sposób wszystko działa, nawet jeśli przeglądarka jest zamknięta lub użytkownik opuści stronę.

Wybieram redis, ponieważ jest on prosty i szybki.