2013-11-20 3 views
7

मैं उदाहरण कोड के साथ Flask-Sockets उपयोग करने के लिए कोशिश कर रहा हूँ:फ्लास्क-सॉकेट का उपयोग कैसे करें? 'Wsgi.websocket'

sockets = Sockets(app) 

@sockets.route('/echo') 
def echo_socket(ws): 
    while True: 
     message = ws.receive() 
     ws.send(message) 

दुर्भाग्य से, जब बस यूआरएल के लिए जा रहा/मेरी ब्राउज़र का उपयोग कर गूंज यह मुझे एक त्रुटि कह देता है एक KeyError हो रही है:

File "/Library/Python/2.7/site-packages/Flask-0.10-py2.7.egg/flask/app.py", line 1836, in __call__ 
return self.wsgi_app(environ, start_response) 
File "/Library/Python/2.7/site-packages/flask_sockets.py", line 37, in __call__ 
environment = environ['wsgi.websocket'] 
KeyError: 'wsgi.websocket' 

कोई भी विचार क्या मैं गलत कर रहा हूं? सभी सुझावों का स्वागत है!

[संपादित करें] @jbub - युक्तियों के लिए धन्यवाद! तो शुरू करने के लिए अब मैं अंतर्निहित देव-सर्वर के बजाय बंदूक का उपयोग करता हूं। तो मैंने इसे gunicorn -k flask_sockets.worker -b 0.0.0.0:5000 main:app का उपयोग शुरू किया। मैंने फिर नीचे दिए गए कोड को मेरे विचारों में डाला। मैं ncho_test.html आपके द्वारा प्रदान किया गया कोड है। जब मैं अब/echo_test पर जाता हूं, तो मुझे वास्तव में "सॉकेट बंद" कहने का संकेत मिलता है।

sockets = Sockets(app) 

@sockets.route('/echo') 
def echo_socket(ws): 
    while True: 
     message = ws.receive() 
     ws.send(message) 

@app.route('/echo_test', methods=['GET']) 
def echo_test(): 
    return render_template('echo_test.html') 

लेकिन मान लीजिए कि मेरी उद्देश्य एक पृष्ठ अन्य मूल्यों बेतरतीब ढंग से सूची से चुने गये साथ अद्यतन किया जाता है जिस पर एक शब्द (बेतरतीब ढंग से एक सूची से चुने गये) के लिए कर रही है। क्या आपके पास इसे प्राप्त करने के बारे में कोई सुझाव होगा?

+1

क्या आप किसी भी http सर्वर के पीछे चल रहे हैं? क्या आपके पास libevent, gevent और gevent-websocket स्थापित है? – jbub

+1

@jbub - मैं अपाचे और फ्लास्क देव-सर्वर दोनों चला रहा हूं। लेकिन जहां तक ​​मुझे पता है, वे एक-दूसरे के रास्ते में नहीं आते हैं। फ्लास्क सर्वर से चलने वाली सभी अन्य चीजों में कोई समस्या नहीं है। इसके अलावा, मैंने अभी इस सवाल में जोड़ा है कि मैं बस अपने ब्राउज़र के साथ यूआरएल का दौरा कर रहा हूं, मुझे लगता है कि सही शुरू करने का तरीका है? किसी अन्य सुझाव का स्वागत है क्योंकि मैं बहुत हताश हूं .. – kramer65

+0

इस समस्या में चल रहे अन्य लोगों के लिए ध्यान दें। सुनिश्चित करें कि आपका पोर्ट सही है। ज्यादातर मामलों में बंदरगाह 8000 नहीं 5000 होना चाहिए। –

उत्तर

8

आह, समस्या है, आप नियमित रूप से जीईटी अनुरोध के साथ वेबस्केट एंडपॉइंट पर जा सकते हैं, इस तरह wsgi.websocket वातावरण पर सेट नहीं किया जाएगा।

भी नहीं डेव सर्वर gunicorn उपयोग करें, यह पहले से कॉन्फ़िगर कार्यकर्ता के साथ आता है:

# install from pip 
pip install gunicorn 

# run app located in test.py module (in test.py directory) 
gunicorn -k flask_sockets.worker test:app 

मैं यहाँ त्वरित उदाहरण दिया, पता और पोर्ट अपने सेटअप मैच के लिए अद्यतन करने के लिए सुनिश्चित करें।

<!DOCTYPE html> 
<html> 
    <head> 
    <script type="text/javascript"> 
     var ws = new WebSocket("ws://localhost:8000/echo"); 
     ws.onopen = function() { 
      ws.send("socket open"); 
     }; 
     ws.onclose = function(evt) { 
      alert("socket closed"); 
     }; 
    </script> 
    </head> 
</html> 

इस तरह ब्राउज़र सर्वर के लिए अनुरोध भेजता, जो यह दर्शाएगा WebSocket करने के लिए HTTP से प्रोटोकॉल स्विच करना चाहता है।

यहाँ WebSockets बारे में कुछ और पढ़ने के लिए स्वतंत्र महसूस:

+0

युक्तियों के लिए धन्यवाद! अब मैं अलर्ट देखता हूं। मैं बस विचार करता हूँ; मैं कुछ कैसे अपडेट करूं (एक शब्द की तरह) ताकि मैं इसे नए मानों से बदलूं? उस पर कोई सुझाव? – kramer65

+0

यदि आप संदेश भेजना शुरू करना चाहते हैं, तो इस उदाहरण को जांचने के लिए स्वतंत्र महसूस करें https://github.com/heroku-examples/python-websockets-chat/blob/master/chat.py, यह फ्लास्क-सॉकेट पर आधारित है :) – jbub

+0

क्या गनिकोर्न और केवल फ्लास्क के बिना ऐसा करने का कोई तरीका है? यह एक और प्रक्रिया चलाने के लिए परेशानी की तरह लगता है। –

2

ऐसा लगता है तो आप स्थापित करने के लिए है कि या तो कुप्पी के सॉकेट सॉकेट सर्वर प्रदान की नहीं है प्रॉक्सी वेब सॉकेट के लिए nginx, अपने ऐप को बंदूक का उपयोग करके चलाएं या सॉकेट सर्वर बनाएं।

मैं यह सहायक https://gist.github.com/lrvick/1185629

1

तो एडब्ल्यूएस का उपयोग कर पाया, मैंने पाया कि कभी कभी तो यह है कि पोर्ट 80 (और 443) प्रकार के होते हैं 'कस्टम टीसीपी नियम' सुरक्षा समूह को संपादित करने की जरूरत है और नहीं HTTP (और HTTPS)

+0

मैं एडब्ल्यूएस पर तैनाती करने वाला हूं, इसलिए टिप के लिए धन्यवाद! – kramer65

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