2013-06-18 13 views
6

के बाद एक पृष्ठ प्रस्तुत करें मैं एक फ्लास्क फ़ंक्शन में jQuery $ .post() के साथ एक फॉर्म से डेटा भेजता हूं। फ़ंक्शन डेटा की कुछ लंबी चलती गणना करता है। इस मामले में, मैं कुछ HTML वापस भेजना नहीं चाहता बल्कि एक नया टेम्पलेट प्रस्तुत करना चाहता हूं। जब मैं jQuery/AJAX के साथ फ़ंक्शन को कॉल करता हूं तो मैं यह कैसे कर सकता हूं?

प्रपत्र:

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

प्रपत्र इनपुट पर गणना कुछ समय लगता है, इसलिए मैं 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? 
    }); 
}); 

कुप्पी में, इसी समारोह इस तरह दिखता है:

@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? 

मैं एक रीडायरेक्ट यूआरएल और जेएसओएन वापस नहीं भेजना चाहता, लेकिन वास्तव में एक टेम्पलेट प्रस्तुत करना चाहता हूं।

उत्तर

4

टेम्पलेट आप प्रस्तुत करना तो बस HTML का एक टुकड़ा है, तो आप इसे वापस कर सकते हैं जैसे आप अपने बोतल कोड में दिखाया गया है और ब्राउज़र में निम्न कार्य किया है:

$.("#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); 
    }); 
}); 

यह उम्मीद देखने के लिए अपनी बोतल टेम्पलेट कुछ इस तरह:

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

यह बड़ा हो सकता है, लेकिन हम पेज ताकि कोई साइडबार, मेनू नेविगेशन या html/शरीर टैग, HTML के सिर्फ एक सरल टुकड़ा अंदर डालने कर रहे हैं।

समस्या तब उत्पन्न होती है जब आप अपने फ्लास्क फ़ंक्शन के साथ एक पूर्णतः HTML पृष्ठ वापस भेजते हैं, क्योंकि यह मौजूदा पृष्ठ के अंदर सही ढंग से प्रस्तुत नहीं किया जाएगा।

+0

यह काम करेगा। समस्या यह है: 'परिणाम' बड़ा और जटिल है। टेम्पलेट के साथ इसे टेबल में रखना आसान है। लेकिन पाइथन/फ्लास्क फ़ंक्शन में लंबे HTML आउटपुट को संकलित करना अच्छा नहीं होगा ... –

+0

अधिक सामान्य: क्या आपको AJAX अनुरोध के बाद उत्पन्न डेटा (बहुत से) डेटा को सहेजने और इसे एक्सेस करने का सबसे अच्छा तरीका है अगला अनुरोध (यानी $ .post कॉलबैक में एक साधारण window.location.replace())। –

+2

अधिक आम तौर पर, आप इसे डेटा की गणना/उत्पन्न कर सकते हैं, इसे स्थानीय रूप से सहेज सकते हैं (सर्वर-साइड, कुछ अस्थायी स्टोर जैसे मेमकैड या रेडिस या यहां तक ​​कि डिस्क तक) और किसी विशिष्ट पैरामीटर के साथ किसी अन्य पृष्ठ पर रीडायरेक्ट करें (एक आईडी या इसके लिए समान गणना) जो परिणाम को सामान्य वेबपृष्ठ के रूप में दिखाती है। हालांकि, AJAX कॉल के माध्यम से बहुत सारे डेटा भेजने में कुछ भी गलत नहीं है - सभी उद्देश्यों और उद्देश्यों के लिए यह "सामान्य" HTTP अनुरोध के समान ही काम करता है। –

1

तरीके यह करने के लिए की एक बहुत कुछ बाहर की कोशिश के बाद:

मुझे लगता है कि सबसे अच्छा तरीका एक नया पृष्ठ के लिए एक लंबी चलने वाली सर्वर साइड गणना से डेटा भेजने के लिए सर्वर साइड भंडारण किसी तरह का उपयोग करने के लिए है। इस तरह सबकुछ काम करता है भले ही ब्राउजर बंद हो या उपयोगकर्ता वेबसाइट छोड़ देता है।

मैं रेडिस के लिए जाता हूं क्योंकि यह मृत सरल और तेज़ है।

संबंधित मुद्दे