现有一个用python写的程序(或者是一个或几个的函数接口),需要在Web前端调用python写的函数。如果直接用前端java来调用会很不方便,而且会出现各种麻烦的问题,下面给出如何在web前端调用python的接口。
使用python的RESTful API库将python写的函数封装为Web端可调用的接口,在web端即可直接调用python的程序。
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
即可安装好。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return "hello world"
if __name__=='__main__':
app.run()
如果出现下面的输出,说明flask安装完成,然后复制下面的网站,输入浏览器
如果浏览器上显示返回的内容,则说明配置成功:
上面的是一个简单的例子,下面介绍一下如何调用带参数的python程序
代码如下:
from flask import Flask, request, jsonify
app = 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才可调用成功。
出错最多的为404 NOT Found
,这个错误一般是因为端口与程序中定义的不一致,自行检查一般可以解决。
还有就是Internal Server Error 500
,这个错误说明端口可以正常访问,但是内部的程序或代码语法出现了问题,可以在代码中使用try....except
来捕捉错误具体信息:
from flask import Flask, request, jsonify
app = 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), 500
if __name__ == '__main__':
app.run()
当报错Internal Server Error 500
时,可以采用上述方法来查看具体错误。一般会返回类型值类型为非jsonify或string或数字类型,可以在返回值前添加int、float或str
来进行转换,即可解决问题。
如果是多个函数调用,格式如下:
from flask import Flask, request, jsonify
app = 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, jsonify
app = 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.RasterXSize
rows = ds.RasterYSize
bands = ds.RasterCount
geotrans = ds.GetGeoTransform()
proj = ds.GetProjection()
data = ds.ReadAsArray()
data[data == data[0,0]] = 0
return 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), 500
if __name__ == '__main__':
app.run()