Flask实现Web服务调用Python程序

通过Web服务调用Python写的手写数字识别算法模型,得到手写数字识别结果。

项目场景:

项目需求:将客户端的请求经由Web服务器转发给Flask程序实例。
示例:通过Web服务调用Python写的手写数字识别算法模型,得到手写数字识别结果。

环境准备:

  1. Python环境不多说了
  2. 安装 flask
    pip install flask
  3. 安装 waitress
    pip install waitress

代码:

main.py

from flask import Flask
from predictNumber import predict
app=Flask(__name__)@app.route('/predictNumber/', methods=['POST'])
def predict_number():image = request.form["image"] # 非必须,本案例使用result = predict(image)return {"result": result}if __name__=='__main__':app.debug=Trueapp.run(host='127.0.0.1',port=5000)

其中,手写数字识别的代码 predictNumber.py 赠送如下:

from __future__ import print_function
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.optim.lr_scheduler import StepLR
from PIL import Image
import numpy as np
import base64
from io import BytesIOclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 32, 3, 1)self.conv2 = nn.Conv2d(32, 64, 3, 1)self.dropout1 = nn.Dropout(0.25)self.dropout2 = nn.Dropout(0.5)self.fc1 = nn.Linear(9216, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = self.conv1(x)x = F.relu(x)x = self.conv2(x)x = F.relu(x)x = F.max_pool2d(x, 2)x = self.dropout1(x)x = torch.flatten(x, 1)x = self.fc1(x)x = F.relu(x)x = self.dropout2(x)x = self.fc2(x)output = F.log_softmax(x, dim=1)return outputdef predict(image):# load modelmodel = Net()model.load_state_dict(torch.load("demo/model/mnist_cnn.pt"))model.eval()# load test dataimg = Image.open(image).convert('L') img = img.resize((28, 28)) # 更改图片大小npimg1 = np.array(img) # 转为numpy矩阵flatten_img = npimg1.reshape(1, 1, 28, 28) # 转为mnist1, 1, 28, 28二维张量# 以下意思是把白色背景转为黑色背景,因为训练的都是黑色背景new_flatten_img = (255-flatten_img)/255.0new_flatten_img = new_flatten_img.reshape(1, 1, 28, 28) #      --------  该数据可直接被模型识别test_kwargs = {'batch_size': 1}test_loader = torch.utils.data.DataLoader(new_flatten_img, **test_kwargs)for data in test_loader:data = data.to(torch.float32)output = model(data)pred = output.argmax(dim=1, keepdim=True)print(pred)   print(pred.item())return pred.item()

启动该服务有两种方式

方式一:

通过运行Python脚本启动服务,run.py 代码如下:

from waitress import serve
import main
serve(main.app, host='127.0.0.1',port=5000)

直接运行 run.py 即可

python run.py

验证我们可通过postman发送请求,得到如下结果:

方式二:

通过 cmd 设置 mian.py 路径,我的 main.py 放在E:\pythonProject\下面,大家自行调整。

set  FLASK_APP=E:\pythonProject\main.py

再通过以下指令启动服务:

flask run

效果如下:

以上便是简单版的完整流程。下面加更一些补充说明~


Flask程序必须创建一个程序实例。参见上面第一个代码 main.pyapp = Flask(__name__) 即为实例。

Web服务器把接收到的所有客户端请求,转交给Web服务器网关接口对象处理。需要提供的参数只有一个,就是程序主模块或包的名字,一般就是Python的name变量。

客户端的请求经由Web服务器转发给Flask程序实例。程序实例需要URL到具体代码的映射关系。这个映射关系称为路由。
Flask中最简单的路由定义方式是app.route修饰器。

上面的路由定义,把根路径和predictNumber函数关联起来,如果部署程序的服务器域名是 http://127.0.0.1:5000/,那么浏览器中输入 http://127.0.0.1:5000/predictNumber/ 就会触发这个函数。

函数的返回值称为响应,是客户端接收到的内容。这样如果客户端是Web浏览器,响应就是给客户看的文档。

下面博文中有非常详细完整的介绍,以供参考。

一个简单的Flask Web服务器


实现多并发调用服务可参考:

Flask+gunicorn实现web服务并发调用Python程序,解决多线程/多进程问题

多并发调用Pytorch的坑:

Flask+gunicorn部署深度学习报错gunicorn: error: argument -b: invalid int value ‘0.0.0.0:8000‘

Flask实现Web服务调用Python程序相关推荐

  1. Python教程三:使用Flask搭建web服务

    教程二:使用Aestate操作数据库 Python教程二:使用Aestate操作数据库_Cx_轩的博客-CSDN博客​​​​​​ ----------------------------------- ...

  2. python eel 多线程_利用Eel使JavaScript调用Python程序

    利用Eel使JavaScript调用Python程序 Eel简介 Eel是一个轻量的python桌面GUI开发第三方库, 它使用HTML/JS作为界面开发语言, 但是能够访问所有的python功能, ...

  3. java能调用python吗_如何使用运行时在Java中调用python程序 - java

    我想用来自Java的参数调用python程序.但是我的输出是空白.代码在这里. Python代码在这里: import sys print(sys.argv[1]) Java代码在这里: public ...

  4. m 文件 dll matlab 中调用_如何在matlab中调用python程序

    现在python很火,很多代码都是python写的,如果你和我一样,习惯了使用matlab,还想在matlab中调用Python的代码,应该怎么办呢?其中一条思路:首先在matlab中调用系统脚本命令 ...

  5. php调用python绘图程序_如何在matlab中调用python程序

    现在python很火,很多代码都是python写的,如果你和我一样,习惯了使用matlab,还想在matlab中调用Python的代码,应该怎么办呢?其中一条思路:首先在matlab中调用系统脚本命令 ...

  6. 网站建设与深度学习(PHP调用Python程序)

    一.深度学习应用 我采用的时Google开发的Tensorflow深度学习框架,基于Python编写的图片语义描述深度学习应用. 二.PHP调用 php中无法带调用python程序中的方法,但是可以用 ...

  7. 如何在HTML文档中调用Python程序?

    如何在HTML文档中调用Python程序? 简介: ​ 前几天突然遇到这样的一个需求,在html页面中调用python程序对图像进行处理,之后将处理后的图像重新显示在页面中.刚开始还不知道html页面 ...

  8. jim highsmith_自动化测试NET Web服务和应用程序我刚刚发现Jim Jim

    jim highsmith Automated Testing .NET Web Services and Applications 自动化测试.NET Web服务和应用程序 I just found ...

  9. ajax web服务调用无效 参数值,json调用web服务,报错,无参数值!

    前台:ShowDetail("英伦学院派马夹"); function ShowDetail(productId) { // make an ajax call to the web ...

最新文章

  1. overflow超出显示_[CSS]text-overflow: ellipsis;什么时候可能不生效?
  2. 熬了一个通宵,终于把 7 千万个 Key 删完了
  3. 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | dex_file.cc 中创建 DexFile 实例对象的相关函数分析 )
  4. http://weibo.com/ttarticle/p/show?id=2309404093227413177868
  5. python教程:15种字符串操作方法
  6. Spring Boot 正确中使用JPA实战
  7. 02_3中方式的反射,通过Class.forName获得Class对象,通过类.class获得字节码对象,通过类实例.getClass()的方式获得Class对象
  8. C语言中的结构体,联合,链表和枚举,位域(上)
  9. 江苏省计算机等级知识,江苏省计算机二级考试基础知识_计算机基础练习题
  10. ibatis insert mysql_让iBatis中的insert返回主键
  11. 如何理解封装java_理解 Java 的三大特性之封装
  12. Nginx + Tomcat + HTTPS 配置不需要在 Tomcat 上启用 SSL 支持
  13. 界面排版-TableLayout的stretchColumns方法
  14. 非直接缓冲区与直接缓冲区
  15. 小作坊的大道理——读《走出软件作坊》有感
  16. 【强档推荐】动漫初音未来Ⅱ主题
  17. 计算机科学与技术的学习路线
  18. 使用Spreadsheet操作Excel
  19. 微信小程序跳过第三方的_微信小程序怎么解除第三方授权?
  20. 操作系统原理学习-概述

热门文章

  1. 2018_Semantic SLAM Based on Object Detection and Improved Octomap_note
  2. Linux网络编程——在线词典项目
  3. 2020年茶艺师(初级)考试题及茶艺师(初级)新版试题
  4. CAIRDC6月20日直播总结《物流机器人的挑战与发展》
  5. python期末考试重点_python语言基础与应用期末考试OJ
  6. 开源分布式量化交易系统——开篇
  7. 服务器文件夹重定向,使用组策略将用户文件夹重定向到D盘
  8. 华为销售LTC/研发IPD/服务ITR流程变革之道与启发训练营公开课!|6月11~12日 海口
  9. 很抱歉,由于您访问的URL有可能对网站造成安全威胁,您的访问被阻断
  10. 安卓浏览器中video组件会显示播放按钮