2017-10-07 15 views
5

socketservice.py विभिन्न फाइलों में जवाब देने के ईवेंटबोतल socket.io

from flask_socketio import SocketIO, emit 
from bson.json_util import dumps 
from backend.socketservice import socketio 
from backend.database import db 

def syncElections(): 
    elections = db.elections.find() 
    emit('syncElections',dumps(res) , broadcast=True) 

@socketio.on('createElection') 
def createElection(data): 
    db.elections.insert({'title': data["title"]}) 
    syncElections() 

समस्या है, कि createElection घटना बुलाया जा रहा है कभी नहीं है, यह तब होता है जब फ़ाइल electionAdministration.py के भीतर। जब मैं इसे socketservice.py में ले जाता हूं, तो यह अचानक काम करता है।

लेकिन मेरा मतलब है, मैं सब कुछ एक फाइल में नहीं डाल सकता, क्योंकि एप्लिकेशन बढ़ने के साथ ही यह बहुत गन्दा हो जाएगा।

उत्तर

2

आपको मुख्य मॉड्यूल में अपना द्वितीयक मॉड्यूल आयात करने की आवश्यकता है, लेकिन socketio चर के बाद आपको इसे करने की आवश्यकता है, क्योंकि यदि आप सर्कुलर निर्भरता त्रुटियों में भाग नहीं लेते हैं।

उदाहरण:

from flask import Flask, render_template 
from flask_socketio import SocketIO, emit 
from backend.database import db 

app = Flask(__name__) 
socketio = SocketIO(app, engineio_logger=True) 

@socketio.on('connect') 
def handle_connection(): 
    from backend.electionAdministration import syncElections 
    syncElections() 

import electionAdministration # <--- import your events here! 

if __name__ == '__main__': 
    socketio.run(app) 

इसके अलावा, आप पर विचार करना है कि अपने मुख्य अजगर स्क्रिप्ट, socketservice के नाम से जाना नहीं जा रहा है की जरूरत है, क्योंकि अजगर हमेशा के नाम शीर्ष स्तर के स्क्रिप्ट __main__। तो, अगर आप अपने मुख्य स्क्रिप्ट के रूप में ऊपर स्क्रिप्ट शुरू करते हैं, दूसरी फ़ाइल socketio इस प्रकार आयात करना चाहिए:

from __main__ import socketio 

यह अजगर, जो बदतर बना दिया है के साथ एक छोटे झुंझलाहट है, जब आप एक स्क्रिप्ट करना चाहते हैं कि आप कभी-कभी मुख्य स्क्रिप्ट के रूप में चलाया जाता है, लेकिन दूसरी बार आप इसे किसी अन्य स्क्रिप्ट द्वारा आयात करना चाहते हैं। इस तरह के मामले में आयात कार्य करने के लिए, मैं निम्नलिखित चाल का उपयोग करता हूं:

try: 
    from __main__ import socketio 
except ImportError: 
    from socketservice import socketio 
+0

मैं कसम खाता हूं कि यह थोड़ी देर के लिए काम कर रहा था, लेकिन हो सकता है कि मैं दोनों फाइलों में ईवेंट के साथ समाप्त हो गया हो। वैसे भी, आपके द्वारा उल्लिखित आयात विवरण के साथ भी, ईवेंट अभी भी आयात नहीं किया जा रहा है जब यह केवल आयातित फ़ाइल में है :( – netik

+0

'__main__' के बारे में जानकारी के साथ मेरा उत्तर अपडेट किया गया। – Miguel