2017-05-26 7 views
0

J'essaie d'intégrer Flask-SocketIO avec mon application Flask.Flask-SocketIO erreur de lancement d'impression bleue

Pour une raison quelconque, j'obtiens une erreur d'importation qui est déclenchée par le depuis les sockets d'importation d'applications; que j'ai dans mon admin.py et je ne sais pas pourquoi.

J'apprécierais grandement toute aide fournie.

admin_online/admin.py

from flask_socketio import send, emit 
from flask_socketio import join_room, leave_room 
from app import sockets; 
#from .. import sockets//error 
# from ..app import socket //also an error 
from flask import Blueprint 


admin_online=Blueprint('admin_online', __name__) 

@sockets.on('add-message', namespace='/') 
def send_disconnect(message): 
    print ',messae'; 
    emit('message', message) 


@sockets.on('disconnect', namespace='/') 
def test_disconnect(): 
    realoutput = "No" 
    print 'dscone'; 


@sockets.on('join', namespace='/') 
def on_join(data): 
    username = data['username'] 
    room = data['room'] 
    print 'coonectg'+username; 
    join_room(room) 
    emit('message', username) 


@sockets.on('leave', namespace='/') 
def on_leave(data): 
    username = data['username'] 
    room = data['room'] 
    leave_room(room) 
    print 'leaving'; 
    emit('message', username) 

app.py

from flask import Flask 
from mongo import init_mongo 
from mail import init_flask_mail 
from celery import Celery 
from sockets import init_sockets 
from admin_online import admin 


def init_app(): 
    return Flask(__name__) 


app = init_app() 

# Celery configuration 
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0' 
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0' 
app.config['CELERY_REDIRECT_STDOUTS_LEVEL'] = 'INFO' 


def make_celery(): 
    celery = Celery(app.import_name, backend=app.config['CELERY_RESULT_BACKEND'], 
        broker=app.config['CELERY_BROKER_URL']) 
    celery.conf.update(app.config) 
    TaskBase = celery.Task 
    class ContextTask(TaskBase): 
     abstract = True 
     def __call__(self, *args, **kwargs): 
      with app.app_context(): 
       return TaskBase.__call__(self, *args, **kwargs) 
    celery.Task = ContextTask 

    return celery 

with app.app_context(): 
    init_flask_mail() 
    init_mongo() 
    sockets = init_sockets() 



##imported here TOO but not worked from admin_online import admin 
app.register_blueprint(admin.admin_online) 




if __name__ == '__main__': 
    sockets.run(app, port=5000, debug=True) 

socket.py

from flask import current_app as app 
from flask_socketio import SocketIO 

socketio = None 

def init_sockets(): 
    return SocketIO(app) 

structure d'application

admin_online/admin.py

app.py

sockets.py

erreur

Traceback (most recent call last): 
    File "app.py", line 19, in <module> 
    from admin_online import admin 
    File "E:\Iccacerate\ICaccerate-Backend\icarcerate-backend\admin_online\admin.py", line 3, in <module> 

from app import sockets; 

    File "E:\Ii\app.py", line 19, in <module> 

    from admin_online import admin 

ImportError: cannot import name admin 

Répondre

0

Vous avez des importations circulaires. La question est la suivante:

  • app.py tente d'importer admin de admin_online.py (notez que ceci est au-dessus du lieu app.pysockets est défini)
  • admin_online/admin.py tente d'importer sockets de app.py, qui n'existe pas encore , parce que l'interpréteur n'a pas encore terminé l'analyse de app.py.

Une solution possible est de déplacer le morceau de code qui initialise sockets dans app.py dessus de la ligne from admin_online import admin.