【问题标题】:Flask socketio split app.py: AttributeError: 'Blueprint' object has no attribute 'wsgi_app'Flask socketio split app.py:AttributeError:'Blueprint'对象没有属性'wsgi_app'
【发布时间】:2017-01-14 18:13:31
【问题描述】:

我正在使用烧瓶 socketio 进行网络套接字项目,并使用烧瓶 blueprint 拆分视图。问题是 socketIO 工作不正常并且出现以下错误:

/flask_socketio/__init__.py", line 31, in __init__
    flask_app.wsgi_app,
AttributeError: 'Blueprint' object has no attribute 'wsgi_app'

我的项目结构如下:

|-- App
|   |-- __init__.py
|   |-- app.py
|   |-- templates
|   |   |-- main.html
|   |   |-- pymeetups.html
|   -- views
|       |-- __init__.py
|       | --- test.py
|-- __init__.py
|-- run.py

运行.py:

from gevent import monkey
from flask import Flask, render_template, request
from flask_socketio import SocketIO
monkey.patch_all()

from App.views import test
app = Flask(__name__, template_folder='app/templates')
app.register_blueprint(test.app)
socketio = SocketIO(app)

if __name__ == '__main__':
    socketio.run(app, "0.0.0.0", port=80)

test.py:

from flask import Blueprint, render_template, Flask
from flask_socketio import SocketIO
app = Blueprint('app', __name__)

socketio = SocketIO(app)


@app.route('/')
def main():
    return render_template('main.html')


@socketio.on('connect', namespace='/dd')
def ws_conn():
    print("connect")
    socketio.emit('msg', {'count': 1}, namespace='/dd')


@socketio.on('disconnect', namespace="/dd")
def ws_disconn():
    print("disconnect")

问题来自 test.py 文件中的语句:

app = Blueprint('app', __name__)

socketio = SocketIO(app)

如果不使用烧瓶蓝图并将所有内容合并到一个文件中,它可以完美运行:

app.py:

from gevent import monkey
from flask import Flask, render_template, request
from flask_socketio import SocketIO
monkey.patch_all()


app = Flask(__name__)
socketio = SocketIO(app)


@app.route('/')
def main():
    return render_template('main.html')



@socketio.on('connect', namespace='/dd')
def ws_conn():
    socketio.emit('msg', {'count': 1}, namespace='/dd')


@socketio.on('disconnect', namespace='/dd')
def ws_disconn():
    print("Disconnected")



if __name__ == '__main__':
    socketio.run(app, "0.0.0.0", port=80)

如果我希望我的应用程序有很多功能并且很难将所有功能管理到一个文件中,我该如何拆分路由?

【问题讨论】:

    标签: python-3.x flask flask-socketio


    【解决方案1】:

    蓝图对象的工作方式类似于 Flask 应用程序对象,但 它实际上不是一个应用程序。

    在您的代码中,您尝试使用蓝图注册扩展 SocketIO(blueprint)。它应该是应用程序扩展而不是蓝图扩展。像这样的东西应该适合你:

    # For example my app structure like this
    - app/
        __init__.py
        app.py
        main/
           __init__.py
           views.py
    

    #app/app.py
    from flask import Flask
    from flask_socketio import SocketIO
    
    app = Flask(__name__)
    socketio = SocketIO(app)
    
    from main import main
    
    app.register_blueprint(main, url_prefix='/main')
    
    if __name__ == '__main__':
        socketio.run(app)
    
    #app/main/__init__.py
    from flask import Blueprint
    
    main = Blueprint('main', __name__)
    
    from . import views
    
    #app/main/views.py
    from . import main
    from app import socketio
    
    @main.route('/')
    def index():
            return "Hello"
    
    @socketio.on('connect', namespace='/dd')
    def ws_conn():
        socketio.emit('msg', {'count': 1}, namespace='/dd')
    
    @socketio.on('disconnect', namespace='/dd')
    def ws_disconn():
        print('Disconnected')
    

    【讨论】:

    • 您指定的结构没有显示与blueprint 相关的错误,但socketio 不工作。没有发出任何套接字。
    • Miguel Gringberg:以下示例应用程序演示了如何构建具有蓝图的大型应用程序:github.com/miguelgrinberg/Flask-SocketIO-Chat
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 2021-04-05
    • 2014-05-15
    • 2017-07-02
    • 2016-01-31
    • 2016-09-19
    相关资源
    最近更新 更多