当前位置: 首页 > news >正文

python:使用RESTful API(flask)调用python程序传递参数,实现Web端调用python程序

问题描述

现有一个用python写的程序(或者是一个或几个的函数接口),需要在Web前端调用python写的函数。如果直接用前端java来调用会很不方便,而且会出现各种麻烦的问题,下面给出如何在web前端调用python的接口。

解决方法

使用python的RESTful API库将python写的函数封装为Web端可调用的接口,在web端即可直接调用python的程序。

解决过程

1. 安装RESTful API环境

RESTful API环境其实主要是需要安装flask库,安装方法如下:
使用pip安装:

pip install flask

使用conda 安装:
如何没有创建新的虚拟环境,首先创建虚拟环境:

conda create --name <环境名称> [python=<Python版本>]
# 例如
conda create --name myenv python=3.10

然后激活进入创建的新环境:

conda activate myenv

然后安装flask:

conda install flask

安装途中选择y即可安装好。

2.测试是否安装完成

from flask import Flaskapp = Flask(__name__)@app.route('/')  
def hello_world():return "hello world"if __name__=='__main__':app.run()

如果出现下面的输出,说明flask安装完成,然后复制下面的网站,输入浏览器
在这里插入图片描述
如果浏览器上显示返回的内容,则说明配置成功:
在这里插入图片描述

3. 如何调用带参数的python程序

上面的是一个简单的例子,下面介绍一下如何调用带参数的python程序
代码如下:

from flask import Flask, request, jsonifyapp = Flask(__name__)# 求三个数的乘积,第三个输入参数为数组类型
def multiply(num1,num2,num3):return num1*num2*num3[0]# sum 为端口,methods为方法
@app.route('/sum', methods=['GET'])
def sum_numbers():# 首先获取参数,将参数读进来num1 = float(request.args.get('num1'))num2 = int(request.args.get('num2'))num3 = np.array(eval(request.args.get('num3')))# 将读取到的参数输入函数和所要计算公式中result = num1 + num2 + multiply(num1,num2,num3)# 所要返回的内容,该例子返回的是一个字典类型数据result = {'ID':num1,'sum':result}return jsonify(result)if __name__ == '__main__':app.run()

运行程序后,在浏览器输入:

http://127.0.0.1:5000/sum?num1=10&num2=20&num3=[2,3]

则可以显示返回值
在这里插入图片描述
根据上述步骤即可实现在Web端调用python程序接口。但调用接口的时候需要先运行上述的函数或接口,然后在浏览器中输入相应的url才可调用成功。

注意事项

1. 报错如何解决

出错最多的为404 NOT Found,这个错误一般是因为端口与程序中定义的不一致,自行检查一般可以解决。
还有就是Internal Server Error 500,这个错误说明端口可以正常访问,但是内部的程序或代码语法出现了问题,可以在代码中使用try....except来捕捉错误具体信息:

from flask import Flask, request, jsonifyapp = Flask(__name__)# 求三个数的乘积,第三个输入参数为数组类型
def multiply(num1,num2,num3):return num1*num2*num3[0]# sum 为端口,methods为方法
@app.route('/sum', methods=['GET'])
def sum_numbers():try:# 首先获取参数,将参数读进来num1 = float(request.args.get('num1'))num2 = int(request.args.get('num2'))num3 = np.array(eval(request.args.get('num3')))# 将读取到的参数输入函数和所要计算公式中result = num1 + num2 + multiply(num1,num2,num3)# 所要返回的内容,该例子返回的是一个字典类型数据result = {'ID':num1,'sum':result}return jsonify(result)except Exception as e:traceback.print_exc()return "Internal Server Error: " + str(e), 500if __name__ == '__main__':app.run()

当报错Internal Server Error 500时,可以采用上述方法来查看具体错误。一般会返回类型值类型为非jsonify或string或数字类型,可以在返回值前添加int、float或str来进行转换,即可解决问题。

2. 多个函数调用

如果是多个函数调用,格式如下:

from flask import Flask, request, jsonifyapp = Flask(__name__)
def function1():def function2():def function3():……
if __name__ == '__main__':app.run()

以上就是全部内容,最后贴出一个如何用flask调用简单处理栅格数据的例子,其他操作可以参考:

# test
import numpy as np
import math
from osgeo import gdal
from osgeo import osr
from osgeo import ogr
from shapely.geometry import Point
from shapely.wkt import dumps
from flask import Flask, request, jsonifyapp = Flask(__name__)folder_dem = "C:\\Users\\Administrator\\Desktop\\ycDEM.tif"# read data, nan to 0
def ReadData(filepath):gdal.AllRegister()ds = gdal.Open(filepath)cols = ds.RasterXSizerows = ds.RasterYSizebands = ds.RasterCountgeotrans = ds.GetGeoTransform()proj = ds.GetProjection()data = ds.ReadAsArray()data[data == data[0,0]] = 0return data@app.route('/ReadData1')
def test1():try:a = ReadData(folder_dem)b = np.max(a)point1 = Point(31.3,42.3)wkt1 = dumps(point1)c = {'a': int(b), 'b': int(b), 'c':wkt1}# 返回包含两个字典return jsonify([c,c])except Exception as e:traceback.print_exc()return "Internal Server Error: " + str(e), 500@app.route('/ReadData2')
def test2():try:a = ReadData(folder_dem)b = np.max(a)point1 = Point(3,4)wkt1 = dumps(point1)c = {'a': int(b), 'c':wkt1}return jsonify([c,c])except Exception as e:traceback.print_exc()return "Internal Server Error: " + str(e), 500if __name__ == '__main__':app.run()

更多内容关注公众号: GISerQ

http://www.lryc.cn/news/165620.html

相关文章:

  • 贪心算法(Greedy Algorithm)
  • 论文阅读 - Outlier detection in social networks leveraging community structure
  • 【操作系统】进程控制
  • Linux命令200例:expr一个用于进行数值表达式求值的工具
  • 当你的公司突然开始大量的裁员,被留下的你,真的准备好面对以后了吗?
  • 预约陪诊就诊小程序源码多城市开发版
  • upload-labs文件上传靶场实操
  • leetcode分类刷题:队列(Queue)(二、优先队列解决TopK简单问题)
  • 【排障记录】扩展坞USB 3.0能用而2.0不能用
  • 01-从JDK源码级别剖析JVM类加载机制
  • AI时代:探索机器学习与深度学习的融合之旅
  • 模块化开发_groupby查询think PHP5.1
  • elementUI时间选择器
  • 第1章_瑞萨MCU零基础入门系列教程之单片机程序的设计模式
  • 【UE】刀光粒子效果——part2 材质函数部分
  • 为什么项目经理的时间观念这么重?
  • 编码转换流
  • Pycharm创建项目时如何自动添加头部信息
  • DAY48
  • 光栅和矢量图像处理:Graphics Mill 11.4.1 Crack
  • vue3中组件没有被调用,没进去也没报错
  • Postgresql中ParamListInfoData的作用
  • 《计算机视觉中的多视图几何》笔记(1)
  • YOLO目标检测——火焰检测数据集+已标注xml和txt格式标签下载分享
  • tkinter四大按钮:Button,Checkbutton, Radiobutton, Menubutton
  • Sudowrite:基于人工智能的AI写作文章生成工具
  • 加密狗软件有什么作用?
  • 嵌入式Linux驱动开发(I2C专题)(二)
  • SMT贴片制造:发挥的作用和价值]
  • 蓝桥杯官网练习题(幸运数字)