2014-06-18 5 views
5

मैं वर्तमान में एक "बड़ी" समस्या पर फंस गया हूं, और मैं इसके बारे में स्पष्ट और संक्षिप्त होने की कोशिश करूंगा। मैं फ्लास्क का उपयोग कर पाइथन में एक उपकरण विकसित कर रहा हूं। यह एक इंट्रानेट होने का मतलब है। विचार यह है कि मेरे पास एक ग्राहक पृष्ठ है। इसका नाम, कई अन्य इंफोस, और एक विशाल चेकलिस्ट है।फ्लास्क फ्लैश और url_for AJAX

इंफोस पहले ही इनपुट फ़ील्ड में लिखे गए हैं, ताकि उपयोगकर्ता को उन्हें वहां संपादित करना होगा, एंटर दबाएं, और पृष्ठ को संपादित जानकारी (एक अधिसूचना के साथ, चमकदार संदेशों और उगने का उपयोग करके) के साथ पुनः लोड किया गया है। भारी चेकलिस्ट मुझे AJAX का उपयोग कर सिस्टम पर जाने के लिए मजबूर कर रही है, क्योंकि मैं इसे "लाइव" अपडेट करना चाहता हूं क्योंकि उपयोगकर्ता बॉक्स को टिके हुए हैं और पृष्ठ को पुनः लोड किए बिना इनपुट में सामग्री दर्ज करते हैं।

परिणामस्वरूप, मैं इंजेस के लिए इंजेक्स के लिए अपने बुनियादी इनपुट को भी बदल रहा हूं, ताकि मज़े के पुनः लोडिंग से बचा जा सके।

पहले एक संदेश कुप्पी की सुविधा चमकती चिंताओं:

मैं दो मुद्दों का सामना करना पड़ा। मेरे पास एक तरीका है जो डेटाबेस में क्लाइंट नाम अपडेट करता है, एक संदेश (सफलता या विफलता, कई चीजों के आधार पर) चमकता है, फिर पृष्ठ को फिर से प्रदर्शित करता है। पेज रीलोड से बचने के लिए, मैं AJAX के साथ सबमिट फॉर्म का प्रबंधन कर रहा हूं।

समस्या यह है कि, मेरी पायथन विधि संदेश फ्लैश करेगी। और एक बार जब मैं अपने एचटीएमएल पेज पर वापस आ गया हूं (जिसे पुनः लोड नहीं किया गया है, क्योंकि यह AJAX है), Jinja2 का get_flashed_message फ़ंक्शन मुझे कुछ भी नहीं देता है, क्योंकि इसे अपडेट नहीं किया गया है। नतीजतन, उन flashed संदेशों को पुनर्प्राप्त करना मेरे लिए असंभव है।

मैं इन्हें कैसे प्राप्त कर सकता हूं? एकमात्र समाधान जो मैं देखता हूं वह फ्लैश के किसी भी उपयोग से छुटकारा पा रहा है, और अपने संदेशों को सिडमेम कोडिंग कर रहा है, कि मैं विधि से वापस आऊंगा, और फिर जावास्क्रिप्ट में इलाज करूँगा। जो अविश्वसनीय रूप से गूंगा लगता है, क्योंकि फ्लैश फ्लास्क की एक विशेषता है, और इसे AJAX द्वारा "बेकार" बनाया गया है? मुझे लगता है कि मुझे कुछ याद आ रहा है। url_for

दूसरा मुद्दा चिंताओं (एक नोट के रूप, अब तक, मेरी फ्लैश संदेशों प्रबंधन मेरा आधार लेआउट, कि कि सभी संदेश के माध्यम से चलाता है और उन्हें ग्राउल सूचनाओं के रूप में प्रदर्शित करता है एक टेम्पलेट कॉल में किया जाता है)। यहाँ क्लाइंट का नाम संपादित करने के लिए मेरी रूप है,:

<form id="changeClientName" method="POST" action="{{ url_for('clients.edit_client_name', name=client.name) }}" style="display:inline !important;"> 
    <input type="text" name="name" class="form-control" value="{{ client.name }}" > 
    <input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;"/> 
</form> 

आप देख सकते हैं, कार्रवाई विशेषता url_for का उपयोग करता है सही विधि ग्राहक संपादित करने के लिए कॉल करने के लिए। मेरे विधि इस प्रकार है:

@mod.route('/edit/<name>/', methods=['POST']) 
def edit_client_name(name): 

तो url पथ/संपादित करें/the_client_name है। नतीजतन, एक संपादन के बाद, नया यूआरएल/संपादित/the_new_client_name है, अगर हम इस नाम को दोबारा संपादित करना चाहते हैं। जाहिर है, एक बार विधि कहने के बाद, मेरे AJAX को इस क्रिया विशेषता को नए यूआरएल के साथ बदलने के लिए बदलना होगा (यदि उपयोगकर्ता पृष्ठ को बदले बिना पृष्ठ को पुनः लोड/संपादित करना चाहता है)। और यह मेरा दूसरा मुद्दा है।

नया नाम जावास्क्रिप्ट में संग्रहीत है। कार्रवाई अभी भी पुरानी यूआरएल है। इसलिए मुझे नए नाम का उपयोग करके url_for कॉल करना होगा। और मुझे jjacript चर को Jinja2 पास करने का बिल्कुल कोई तरीका नहीं मिला है।

url_for('clients.edit_client_name', name=client.name) 

इस बनने के लिए:

मैं यह चाहता हूँ

url_for('clients.edit_client_name', name=my_javascript_variable_one_way_or_another) 

मैं हूँ बस जे एस समारोह है कि एक फार्म की एक विशेषता को संशोधित करता है कहते हैं, और साथ मेरे कार्रवाई विशेषता को संशोधित करना यह नया url_for.लेकिन मुझे यह आसान चीज़ बनाने का कोई तरीका नहीं मिला है, यानी Jinja2 को जावास्क्रिप्ट चर दें, जो मेरे लिए बहुत ही असंभव प्रतीत होता है।

तो यहां मेरे दो मुद्दे हैं। मैं AJAX के साथ फ़्लैश संगत कैसे बना सकता हूं? और मैं Jinja2 में जावास्क्रिप्ट विशेषता कैसे पास कर सकता हूं?

मैं ईमानदारी से इन दो "बेवकूफ" मुद्दों के समाधान खोजने की उम्मीद करता हूं। एकमात्र समाधान जो मैं देख सकता हूं वह मेरी खुद की मैसेजिंग सिस्टम को कोडिंग करेगा, जो फ्लैश के लक्ष्य को हरा देगा, जो इसे एजेक्स के साथ बेकार बना देगा, जो बेवकूफ लगता है, और मेरे टेम्पलेट्स में यूआरएल हार्डकोडिंग करता है, जो फ्लास्क बनाने के शुरुआती हित को पूरी तरह से हरा देता है यूआरएल विधियों से स्वतंत्र, और यूआरएल बेहद लचीला बदलता है।

धन्यवाद।

+1

आप इसे दो अलग-अलग प्रश्नों में विभाजित कर सकते हैं जिन्हें आप जानते हैं? सबसे पहले, आप अपने जेएसओएन प्रतिक्रिया के हिस्से के रूप में "फ्लैश संदेश" वापस लौटाते हैं और क्लाइंट साइड जावास्क्रिप्ट हैंडल को उचित कक्षाओं (यानी त्रुटि/सफलता) के साथ दिखाते हैं – Oerd

+0

हाँ, मुझे इसे विभाजित करने में हिचकिचाहट हुई, लेकिन दोनों प्रश्न लग रहे थे वास्तव में, बहुत ही करीब, क्योंकि दोनों चिंता करते हैं कि Jinja2 AJAX का प्रबंधन कैसे करता है, दोनों url_for विधि और get_flashed_messages के लिए। मैंने हालांकि बुरा फैसला किया हो सकता है, पता नहीं:/आपके विचार के लिए, मैंने यही सोचा, लेकिन इस मामले में यह पहली तरफ चमकती हुई चमक के उपयोग को अस्वीकार करता है! चूंकि मुझे मैन्युअल रूप से फ़्लैश किए गए संदेशों को लाने और उन्हें प्रदर्शित करने के लिए, मैं फ्लैश() का उपयोग नहीं कर सकता और इसके बजाय तारों की मूल सूची का उपयोग कर सकता हूं, यह अंत में एक ही चीज़ है, नहीं? – lap0573

+1

मुझे लगता है कि ओर्ड सही है। जेएस के माध्यम से फ्लैश संदेश संभाल लें। दूसरे प्रश्न के अनुसार, आप ऐसा कुछ क्यों नहीं पारित करते हैं जो उनके नाम की बजाय उनकी आईडी की तरह नहीं बदलेगा? –

उत्तर

3

मैं इस पर एक स्टैब ले जाऊंगा, लेकिन मुझे यकीन नहीं है कि मैं पूरी तरह से समस्या को समझता हूं: डी। नीचे दिया गया कोड परीक्षण नहीं किया गया है, यह छद्म कोड के साथ अधिक है!

आपकी पहली समस्या है (यदि मैं आपको सही ढंग से समझता हूं) कि आप AJAX के माध्यम से आंशिक अपडेट कर रहे हैं, और आंशिक अपडेट के बाद बाद में अपडेट परिणाम प्राप्त करना चाहते हैं। अपडेट परिणाम बाद में लाने के बजाय, आपको प्रत्येक AJAX कॉल के बाद उन्हें वापस कर देना चाहिए। तो, यह की तरह लग रहा है कि यदि आप अद्यतन कोड है:

data = $('#my-form').serialize() 
$.post(update_url, data, function (results) { 
    // Here you check results. 
    if (results.success) { 
     $('#update-div').message('Update Success') 
    } else { 
     $('#update-div').message('Update Failed: ' + results.error_msg) 
    } 
}) 

फिर अपने अद्यतन मार्ग इस के समान कोड होगा:

from flask import jsonify 

@app.route('/partialupdate/<int:userid>', methods=['POST']) 
def partial_update(userid): 
    try: 
     # fetch the user, perform the updates and commit 
     return jsonify(success=1) 
    except Exception, e: 
     return jsonify(success=0, error_msg=str(e)) 

आपकी दूसरी यूआरएल पीढ़ी को शामिल समस्या के बजाय USERID का उपयोग करके ठीक किया जा सकता ग्राहक नाम का। NEVER खोजों के अलावा अन्य किसी भी चीज़ के लिए ग्राहक नाम का उपयोग करें: डी। इस मामले में उपयोगकर्ता आईडी का उपयोग करें। उपयोगकर्ता आईडी आमतौर पर डेटाबेस में किसी विशेष उपयोगकर्ता के लिए प्राथमिक कुंजी होती है। यदि आप डेटाबेस का उपयोग नहीं कर रहे हैं, तो अपनी खुद की उपयोगकर्ता आईडी को किसी भी तरह जेनरेट करें और उसे उपयोगकर्ता से संलग्न करें - यह प्रति उपयोगकर्ता एक अद्वितीय संख्या होनी चाहिए। उपयोगकर्ता आईडी का उपयोग करना मतलब है कि आप हमेशा '/ edituser/1' जैसे यूआरएल के साथ संपादित कर सकते हैं।

+1

आपके उत्तर के लिए धन्यवाद, जो वास्तव में एरिक वर्कमैन के साथ जुड़ता है। चमकने के लिए, मैं उसका पहला प्रयास करूंगा, और यदि यह बहुत अजीब है, तो मैंने दिखाए गए एक हाथ कोडित सिस्टम का उपयोग करेंगे।दूसरे के लिए, पूरी तरह से, मैं यही करने जा रहा हूँ! धन्यवाद। – lap0573

0

फ्लैश_मेसेज.html प्रारूपित करने के तरीके को समझकर आप फ्लास्क 'फ्लैश' विधि की कार्यक्षमता को प्रतिस्थापित करने के लिए एक सरल जावास्क्रिप्ट विधि लिख सकते हैं।

function flash(message,category){ 
    if (category == 'error'){ 
     var icon='icon-exclamation-sign'; 
     category='danger'; 
     } 
    else if (category == 'success') 
     var icon='icon-ok-sign'; 
    else 
     var icon='icon-info-sign';  
    $('<div class="alert alert-'+category+'"><i class="'+icon+'"></i>&nbsp;<a class="close" data-dismiss="alert">×</a>'+ message +'</div>').prependTo('#maincontent').hide().slideDown(); 
    $.smoothScroll({ 
    scrollElement: $('body'), 
    scrollTarget: '#mainContent' 
    }); 
} 

url_for थोड़ा सा ट्रिकियर हो सकता है, लेकिन संभव है।

1

मुझे यह आवश्यकता भी है।पॉल वैंड का जवाब बाहर मांस के, यहाँ है कि कैसे मैं यह किया है (ध्यान दें, उत्पन्न मार्कअप बूटस्ट्रैप 3 के लिए है):

<div id="flash"></div> 

अपने ajax:

टेम्पलेट में फ्लैश संदेशों के लिए एक खाली div डाल फोन:

$.post("/foo/bar", JSON.stringify({'calls': 'whatever'}), function(returnedData) { 
    $('#flash').append(flashMessage(JSON.parse(returnedData))); 
}); 

और पार्स समारोह का उपयोग करें: अपने मार्ग में

var flashMessage = function(data){ 
    html = ''; 
    for (i=0; i<data.length; i++) { 
    html += '<div class="alert alert-' + data[i]['type'] + '"><a href="#" class="close" data-dismiss="alert">&times;</a>' + data[i].message + '</div>'; 
    } 
    return html; 
}; 

कि संभालती है

[{'type': 'success', 'message': 'Here is a message'}]

जहां 'प्रकार' एक बूटस्ट्रैप 3 स्थिति प्रकार है, अर्थात्: AJAX अनुरोध के लिए, बस एक JSON वस्तु है कि तरह लग रहा है लौटने। सफलता, जानकारी, चेतावनी, खतरे। एक सूची में dict लपेटा जाता है, तो यदि आपको आवश्यकता हो तो आप एकाधिक पास कर सकते हैं।

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