flask-socketio配合blueprint模块化flask

项目结构

project
├─ FlaskServer
│  ├─ App1
│  │  ├─ OtherModules.py
│  │  ├─ routes.py
│  │  └─ __init__.py
│  ├─ App2
│  │  ├─ OtherModules.py
│  │  ├─ routes.py
│  │  └─ __init__.py
│  ├─ SocketioAPP
│  │  ├─ OtherModules.py
│  │  ├─ routes.py
│  │  └─ __init__.py
│  └─ __init__.py
├─ uploads
│  └─ upload
└─ main.py
  • 结构说明:每个app内的__init__.py专注于导入和初始化本模块需要的对象,routes.py专注于实现路由,OtherModules.py是本模块需要的其他类库

注册flask app蓝图的路由函数

  • 为各个模块的app分别注册蓝图时(以App1为例),在./FlaskServer/App1/__init__.py中实例化蓝图并导入蓝图的路由(同目录下的routes.py)。在路由文件中导入该蓝图并为该蓝图注册函数。示例代码如下
# -------------./FlaskServer/App1/__init__.py-------------
from flask import Blueprint
from . import OtherModules # 导入同目录下其他模块

app1 = Blueprint('app1', __name__, url_prefix='/app1') # 实例化蓝图
class1 = OtherModules.Class1() # 实例化需要的对象
from . import routes # 必须在定义蓝图之后再导入!否则会造成蓝图和路由循环导入
# -------------./FlaskServer/App1/routes.py-------------
from . import app1, class1

@app1.route('/', methods=['GET', 'POST'])
def hello_world:
    return class1.hello_world()

注册socketio路由函数

  • 为socketio app注册函数时,直接为项目级的socketio注册函数,为该app指定命名空间,而不是为每个socketio app单独实例化一个socketio对象 (这也符合socketio命名空间的理念: 通过单个共享连接(也称为“多路复用”)拆分应用程序的逻辑)。示例代码如下:
# -------------./FlaskServer/SocketioAPP/__init__.py-------------
from . import OtherModules # 导入同目录下其他模块

class1 = OtherModules.Class1() # 实例化需要的对象
from . import routes # socketio app的routes定义的是本命名空间下的路由函数,也需要导入!
# 这里为了结构统一性将导入routes放在文件最后,实际上在哪里导入都没关系
# -------------./FlaskServer/SocketioAPP/routes.py-------------
from . import class1
from .. import socketio # 导入全局的socketio对象

@socketio.on('connect', namespace='/socket-io-app')
def hello_world:
   return class1.hello_world()

将各个app的蓝图注册到全局的socketio对象中

  • ./FlaskServer/__init__.py中实例化一个全局的socketio对象,定义create_app函数以注册blueprint。实例代码如下:
from flask import Flask
from flask_socketio import SocketIO

socketio = SocketIO() # 实例化socketio对象


def create_app(debug=True):
    """Create an application."""
    app = Flask(__name__)
    from flask_cors import CORS

    CORS(app) # flask app的跨域需要单独处理
    app.debug = debug
    app.config['SECRET_KEY'] = 'secret'

    from . import SocketioAPP  # 导入socketio路由,切记定义之后需要导入,不然不起作用!!!
    from .App1 import app1 # 导入蓝图
    from .App2 import app2

    app.register_blueprint(app1) # 将蓝图注册到app中
    app.register_blueprint(app2)
    socketio.init_app(app, cors_allowed_origins='*') # 将app注册到socketio中。这里的跨域只能解决socketio连接的跨域问题,不能解决flask app(http连接)的跨域问题
    return app

服务器,启动!

  • 最后,运行main.py!
from FlaskServer import create_app, socketio # 导入上面定义的函数和socketio对象


app = create_app(debug=False)


if __name__ == '__main__':
    socketio.run(app, port=5000, log_output=True)
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值