2012-06-05 18 views
5

पर लटका मैं इस सरल बोतल एप्लिकेशन है:बोतल और Web.py दोनों atexit

from flask import Flask 
import prolog_handler as p 

app = Flask(__name__) 
app.debug = False 

@app.route('/') 
def hello(): 
    for rule in p.rules: 
     print rule 
    return 'hello' 

if __name__ == '__main__': 
    app.run(host='0.0.0.0', port=8080) 

prolog_handler मॉड्यूल एक triplestore और भार कुछ नियमों के साथ एक सत्र शुरू होता है। इसमें एक अवांछित फ़ंक्शन भी है जो सत्र समाप्त करता है और "बंद ..." जैसे संदेश को प्रिंट करता है। मैं python myapp.py के साथ बैश प्रॉम्प्ट से सर्वर प्रारंभ करता हूं। जब भी मैं सर्वर को रोकने के लिए CTRL-C दबाता हूं, कुछ भी नहीं होता है। मैं बैश प्रॉम्प्ट पर वापस नहीं लौटाता हूं, और मुझे "बंद ..." संदेश मुद्रित नहीं दिखाई देता है। मैंने इसे एक ही परिणाम के साथ Web.py के साथ करने का प्रयास किया।

tstore = openPrologSession() 
rules = ... 

def cleanUp(): 
    print "Closing..." 
    tstore.endSession() 

atexit.register(cleanUp) 

तो क्यों यह इतना मुश्किल सिर्फ एक atexit कार्य करने के लिए है:

कि prolog_handler करता सचमुच के रूप में इस के रूप में सरल है?

पीएस: अगर मैं प्रोल सत्र को खोलने और इसे समाप्त करने के बारे में सभी चीजों पर टिप्पणी करता हूं, और केवल उस भाग को छोड़ दें जो संदेश "बंद कर रहा है ..." तो मुझे "बंद ..." संदेश दिखाई देता है मैंने CTRL-C मारा और मैं बैश प्रॉम्प्ट पर वापस आ गया। यह उम्मीद के रूप में काम करता है। लेकिन अगर मैं इसके साथ कुछ भी उपयोगी नहीं कर सकता तो अचूकता का क्या मतलब है?

उत्तर

6

यह एकदम सही जवाब नहीं हो सकता है, लेकिन मैं बोतल के लिए निम्नलिखित का उपयोग करने की कोशिश की:

# These functions should be called when you tear down the application 
app.teardown_functions = [] 

def teardown_applications(): 
    for func in app.teardown_functions: 
     print('Calling teardown function %s' % func.__name__) 
     func() 

app.teardown_functions.append(function_tocall_at_exit) 

यह मेरे लिए काम करने लगता है। मैं सभी फ्लास्क अनुप्रयोगों के लिए गीवेंट का भी उपयोग करता हूं

if __name__ == '__main__': 
    gevent.signal(signal.SIGINT, teardown_applications) 
    http_server = WSGIServer(('', 5000), app) 
    http_server.serve_forever() 

यह आमतौर पर मेरे लिए काम करता है।

मॉड्यूल आयात में से कुछ:

from flask import Flask 
from gevent.wsgi import WSGIServer 
import gevent 
import signal 

from gevent import monkey 
monkey.patch_all() 
+0

अहा! कूल मैन, धन्यवाद! –

+0

@ जॉन पीटर थॉम्पसन गार्स: धन्यवाद। जांचें कि यह आपके लिए काम करता है या नहीं। – pyfunc

+0

हाँ, यह अपेक्षित के रूप में काम किया! –

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