問題描述
現(xiàn)有一個用python寫的程序(或者是一個或幾個的函數(shù)接口),需要在Web前端調(diào)用python寫的函數(shù)。如果直接用前端java來調(diào)用會很不方便,而且會出現(xiàn)各種麻煩的問題,下面給出如何在web前端調(diào)用python的接口。
解決方法
使用python的RESTful API庫將python寫的函數(shù)封裝為Web端可調(diào)用的接口,在web端即可直接調(diào)用python的程序。
解決過程
1. 安裝RESTful API環(huán)境
RESTful API環(huán)境其實主要是需要安裝flask庫,安裝方法如下:
使用pip安裝:
pip install flask
使用conda 安裝:
如何沒有創(chuàng)建新的虛擬環(huán)境,首先創(chuàng)建虛擬環(huán)境:
conda create --name <環(huán)境名稱> [python=<Python版本>]
# 例如
conda create --name myenv python=3.10
然后激活進入創(chuàng)建的新環(huán)境:
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()
如果出現(xiàn)下面的輸出,說明flask安裝完成,然后復制下面的網(wǎng)站,輸入瀏覽器
如果瀏覽器上顯示返回的內(nèi)容,則說明配置成功:
3. 如何調(diào)用帶參數(shù)的python程序
上面的是一個簡單的例子,下面介紹一下如何調(diào)用帶參數(shù)的python程序
代碼如下:
from flask import Flask, request, jsonify
app = Flask(__name__)
# 求三個數(shù)的乘積,第三個輸入?yún)?shù)為數(shù)組類型
def multiply(num1,num2,num3):
return num1*num2*num3[0]
# sum 為端口,methods為方法
@app.route('/sum', methods=['GET'])
def sum_numbers():
# 首先獲取參數(shù),將參數(shù)讀進來
num1 = float(request.args.get('num1'))
num2 = int(request.args.get('num2'))
num3 = np.array(eval(request.args.get('num3')))
# 將讀取到的參數(shù)輸入函數(shù)和所要計算公式中
result = num1 + num2 + multiply(num1,num2,num3)
# 所要返回的內(nèi)容,該例子返回的是一個字典類型數(shù)據(jù)
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]
則可以顯示返回值
根據(jù)上述步驟即可實現(xiàn)在Web端調(diào)用python程序接口。但調(diào)用接口的時候需要先運行上述的函數(shù)或接口,然后在瀏覽器中輸入相應的url才可調(diào)用成功。
注意事項
1. 報錯如何解決
出錯最多的為404 NOT Found
,這個錯誤一般是因為端口與程序中定義的不一致,自行檢查一般可以解決。
還有就是Internal Server Error 500
,這個錯誤說明端口可以正常訪問,但是內(nèi)部的程序或代碼語法出現(xiàn)了問題,可以在代碼中使用try....except
來捕捉錯誤具體信息:
from flask import Flask, request, jsonify
app = Flask(__name__)
# 求三個數(shù)的乘積,第三個輸入?yún)?shù)為數(shù)組類型
def multiply(num1,num2,num3):
return num1*num2*num3[0]
# sum 為端口,methods為方法
@app.route('/sum', methods=['GET'])
def sum_numbers():
try:
# 首先獲取參數(shù),將參數(shù)讀進來
num1 = float(request.args.get('num1'))
num2 = int(request.args.get('num2'))
num3 = np.array(eval(request.args.get('num3')))
# 將讀取到的參數(shù)輸入函數(shù)和所要計算公式中
result = num1 + num2 + multiply(num1,num2,num3)
# 所要返回的內(nèi)容,該例子返回的是一個字典類型數(shù)據(jù)
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或數(shù)字類型,可以在返回值前添加int、float或str
來進行轉(zhuǎn)換,即可解決問題。
2. 多個函數(shù)調(diào)用
如果是多個函數(shù)調(diào)用,格式如下:文章來源:http://www.zghlxwxcb.cn/news/detail-807185.html
from flask import Flask, request, jsonify
app = Flask(__name__)
def function1():
…
def function2():
…
def function3():
…
…
if __name__ == '__main__':
app.run()
以上就是全部內(nèi)容,最后貼出一個如何用flask調(diào)用簡單處理柵格數(shù)據(jù)的例子,其他操作可以參考:文章來源地址http://www.zghlxwxcb.cn/news/detail-807185.html
# 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()
更多內(nèi)容關注公眾號: GISerQ
到了這里,關于python:使用RESTful API(flask)調(diào)用python程序傳遞參數(shù),實現(xiàn)Web端調(diào)用python程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!