2010-11-30 14 views
13

मेरे Django एप्लिकेशन में मैं ट्रैक रखना चाहता हूं कि ग्राहक को सफलतापूर्वक प्रतिक्रिया भेजी गई है या नहीं। मुझे अच्छी तरह से पता है कि क्लाइंट को कनेक्शन (और प्रदर्शित) को सुनिश्चित करने के लिए HTTP जैसे कनेक्शन रहित प्रोटोकॉल में कोई "वाटरटाइट" तरीका नहीं है, इसलिए यह मिशन-महत्वपूर्ण कार्यक्षमता नहीं होगी, लेकिन फिर भी मैं इसे करना चाहता हूं नवीनतम संभव समय। प्रतिक्रिया HTML नहीं होगी इसलिए क्लाइंट से किसी भी कॉलबैक (जावास्क्रिप्ट या आईएमजी टैग आदि का उपयोग करना) संभव नहीं है।क्लाइंट को प्रतिक्रिया भेजने के बाद Django में कोड निष्पादित करें

"नवीनतम" हुक जो मैं पा सकता हूं वह मिडलवेयर सूची की पहली स्थिति में एक कस्टम मिडलवेयर कार्यान्वयन प्रक्रिया_response जोड़ देगा, लेकिन मेरी समझ के लिए वास्तविक प्रतिक्रिया का निर्माण करने से पहले इसे क्लाइंट को भेजा जाता है। क्या प्रतिक्रिया सफलतापूर्वक भेजी जाने के बाद Django में कोड को निष्पादित करने के लिए कोई हुक/घटनाएं हैं?

उत्तर

14

विधि मैं इस समय के लिए जा रहा हूँ HttpResponse का एक उपवर्ग का उपयोग करता है:

from django.template import loader 
from django.http import HttpResponse 

# use custom response class to override HttpResponse.close() 
class LogSuccessResponse(HttpResponse): 

    def close(self): 
     super(LogSuccessResponse, self).close() 
     # do whatever you want, this is the last codepoint in request handling 
     if self.status_code == 200: 
      print('HttpResponse successful: %s' % self.status_code) 

# this would be the view definition 
def logging_view(request): 
    response = LogSuccessResponse('Hello World', mimetype='text/plain') 
    return response 

Django कोड पढ़कर मैं बहुत ज्यादा विश्वास है कि HttpResponse.close() नवीनतम बिंदु में कोड इंजेक्षन करने के लिए है हूँ अनुरोध हैंडलिंग। मुझे यकीन नहीं है कि वास्तव में त्रुटि के मामले हैं जो उपरोक्त वर्णित लोगों की तुलना में इस विधि द्वारा बेहतर तरीके से संभाले जाते हैं, इसलिए मैं अब प्रश्न खोल रहा हूं।

लाज़रसाइंस के उत्तर में वर्णित अन्य लोगों के लिए यह दृष्टिकोण पसंद करने के कारण यह है कि इसे अकेले दृश्य में स्थापित किया जा सकता है और इसे मिडलवेयर स्थापित करने की आवश्यकता नहीं है। अनुरोध_फिनिश सिग्नल का उपयोग करते हुए, दूसरी ओर, मुझे प्रतिक्रिया ऑब्जेक्ट तक पहुंचने की अनुमति नहीं दी जाएगी।

+0

एक साधारण जेसन ध्वज भेजने में क्या गड़बड़ है? उपरोक्त सभी क्यों? –

+0

न तो मुझे "जेसन फ्लैग" का मतलब क्या मिलता है और न ही मैं किसी भी तरह से जेएसओएन मेरी समस्या के साथ मेरी मदद कर सकता हूं ... कृपया विस्तृत करें। –

+6

सफल प्रतिक्रिया को संभालने के लिए अच्छी तरह से काम करता है, लेकिन अगर उपयोगकर्ता कनेक्शन को बाधित करता है (टैब को बंद करके या "स्टॉप" बटन पर क्लिक करके) बंद() को निष्पादित नहीं किया जाता है।अगर प्रतिक्रिया को संभालने के बाद आपको कुछ करने की ज़रूरत है, तो एक \ __ del \ __ विधि को परिभाषित करें, भले ही कनेक्शन को मजबूती से बाधित किया गया हो। – vincent

1

मुझे लगता है जब मिडलवेयर आप मिडलवेयर के process_request विधि के बारे में सोच रहे हैं के बारे में बात है, लेकिन वहाँ भी एक process_response method है कि जब HttpResponse वस्तु दिया जाता है कहा जाता है। मुझे लगता है कि यह नवीनतम क्षण होगा जहां आप एक हुक पा सकते हैं जिसका आप उपयोग कर सकते हैं।

इसके अलावा एक request_finished signal निकाल दिया जा रहा है।

+0

मुझे प्रक्रिया_ प्रतिक्रिया के बारे में पता था, लेकिन चूंकि इस विधि से प्रतिक्रिया वापस करने की उम्मीद है, मुझे विश्वास है कि प्रतिक्रिया इस बिंदु पर नहीं भेजी जा सकती थी। request_finished आशाजनक लग रहा है, मैं अब उसमें देख रहा हूं। –

+0

मैंने request_finished की जांच की और दुर्भाग्य से यह निष्पादित किया गया है कि भले ही अनुरोध संभाला गया हो। तो यह मेरे उद्देश्यों के लिए भी बेकार है, क्योंकि मैं केवल सफल प्रतिक्रियाओं को ट्रैक करना चाहता हूं। –

+1

मुझे लगता है कि आपको process_response की तुलना में बाद का पल नहीं मिलेगा, क्योंकि HttpRequest पूरी तरह से कॉन्स्टेक्टेड होने के बाद इसे कहा जाता है और उसके बाद इसे वेब सर्वर पर संभाला जाता है ... –

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

  • कोई संबंधित समस्या नहीं^_^