Flask 服务封装

5 阅读2分钟

前面我们学习了 Flask 的基本使用,接下来我们将自己训练的《投满分项目-新闻文本分类器》通过 Flask 进行部署,使得用户能够通过浏览器提交新闻文本数据,我们的模型能够对新闻进行分类,并返回给用户结果。

1. 业务实现代码

import time

import fasttext
import jieba
import torch
from flask import Flask, request, Response, json
from importlib import import_module
import numpy as np

# 加载自定义的停用词表
jieba.load_userdict('data/stopwords.txt')
# 提供已经训练好的模型路径
model_save_path = 'model/toutiao_fasttext_1699865297.bin'
# 实例化fasttext对象, 并加载模型参数用于推断, 提供服务请求
model = fasttext.load_model(model_save_path)

# 创建Flask应用
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False  # 解决中文乱码问题


# 3.定义请求响应函数-路由1
@app.route('/NewsCls_submit', methods=['GET'])
def email_submit():
    with open('NewsCls_submit.html', 'rb') as file:
        content = file.read()

    return content


# 定义路由,接收POST请求并进行推理
@app.route('/NewsCls_handle', methods=["POST"])
def main_server():
    # 1.从POST请求中获取用户ID和文本数据
    request_json = request.get_json()
    content = request_json['content']

    # 2.调用推理函数获取预测结果
    t1 = time.time()
    # 2.1 数据预处理
    text_new = ' '.join(jieba.lcut(content))
    # 2.2 模型预测
    pred = model.predict(text_new)
    result = pred[0][0]
    t2 = time.time()

    # 3.返回预测结果
    # return f'邮件类型:{prediction}'
    respose_data = {
        'Status': 'success',
        "Result": result,
        'Time': '{:.4f}s'.format(t2 - t1)
    }
    return Response(status=200, response=json.dumps(respose_data, sort_keys=False))


# 如果脚本作为主程序运行,则启动Flask应用
if __name__ == '__main__':
    app.run()

2. 预测结果

image-20241006223054871

虽然,我们能够将我们的模型包装成服务器接口了,但是有个不足之处,当我们要将我们编写的代码部署到某台机器上时,仍然需要重新安装程序依赖各种包环境,非常繁琐。有没有一种办法,能把依赖环境和程序打包到一起,简化部署流程呢?

我们接下来可以使用容器化技术 Docker 来实现。