问题描述

现有一个用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=]

# 例如

conda create --name myenv python=3.10

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

conda activate myenv

然后安装flask:

conda install flask

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

2.测试是否安装完成

from flask import Flask

app = Flask(__name__)

@app.route('/')

def hello_world():

return "hello world"

if __name__=='__main__':

app.run()

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

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

上面的是一个简单的例子,下面介绍一下如何调用带参数的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才可调用成功。

注意事项

1. 报错如何解决

出错最多的为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来进行转换,即可解决问题。

2. 多个函数调用

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

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()

更多内容关注公众号: GISerQ

相关链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。