项目结构
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
服务器,启动!
from FlaskServer import create_app, socketio # 导入上面定义的函数和socketio对象
app = create_app(debug=False)
if __name__ == '__main__':
socketio.run(app, port=5000, log_output=True)