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

news2025/1/21 3:04:02

问题描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1007387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32WB55开发(2)----修改蓝牙地址

STM32WB55开发----2.修改蓝牙地址 概述硬件准备视频教学样品申请完整代码下载选择芯片型号配置时钟源配置时钟树RTC时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙设置工程信息工程文件设置修改置BLE设备公共地址Ble_Hci_Gap_Gatt_Init结果演示 概述 在…

更多场景、更多选择,Milvus 新消息队列 NATS 了解一下

在 Milvus 的云原生架构中&#xff0c;消息队列&#xff08;Log Broker&#xff09;可谓任重道远&#xff0c;它不仅要具备流式数据持久性、支持 TT 同步、事件通知等能力&#xff0c;还要确保工作节点从系统崩溃中恢复时增量数据的完整性。 在 Milvus 的架构中&#xff0c;一切…

【计算机视觉 | 语义分割】干货:语义分割常见算法介绍合集(一)

文章目录 一、U-Net二、Fully Convolutional Network三、SegNet四、DeepLab五、DeepLabv3六、UNet七、PSPNet八、EfficientDet九、SegFormer十、ENet 一、U-Net U-Net 是一种语义分割架构。 它由收缩路径和扩张路径组成。 收缩路径遵循卷积网络的典型架构。 它由两个 3x3 卷积…

基于SSM的学生信息管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Python 图形化界面基础篇:使用包装器( Pack )布局元素

Python 图形化界面基础篇&#xff1a;使用包装器&#xff08; Pack &#xff09;布局元素 引言什么是 Tkinter 的 Pack 布局&#xff1f;步骤1&#xff1a;导入 Tkinter 模块步骤2&#xff1a;创建 Tkinter 窗口步骤3&#xff1a;创建和使用 Pack 布局步骤4&#xff1a; Pack 布…

Android codec2 编码 -- 基于录屏

文章目录 前言android 原生的应用srcreenrecordMediaCodec获取编码数据流程 前言 本篇文章主要是理解Android 12编码的流程&#xff0c; 首先从上层的应用出发理解mediacodec提供给外部API的用法。然后针对每个api 分析编码各个流程中框架中的流程。 熟悉一个框架的流程 可以…

嵌入式这个领域会变得过于内卷吗?

今日话题&#xff0c;嵌入式这个领域会变得过于内卷吗&#xff1f;嵌入式开发主要服务于第二产业&#xff0c;尤其是制造业&#xff0c;包括电器、电气、机械、汽车、装备、航空航天等行业的“智能制造”部门&#xff0c;稳定性较强&#xff0c;不像互联网行业那样波动大。因此…

【LangChain系列 8】Prompt模版——少样本prompt模版(二)

原文地址&#xff1a;【LangChain系列 8】Prompt模版——少样本prompt模版(二) 本文速读&#xff1a; 固定少样本prompt模版 动态少样本prompt模版 在上篇文章中介绍了少样本模版的基本用法&#xff0c;本文将介绍 对话模型(chat model) 中 少样本prompt模版的用法。 LangCh…

C语言双向链表

文章目录 前言双向链表链表头结点的创建节点尾插与尾删节点头插与头删特定位置插入或删除节点链表节点查找双向链表的销毁 链表的打印 前言 假期时间因为为学校开学考试做准备所以一直没更新博客&#xff0c;今天开始博客会陆续更新。 双向链表 之前我们说过了顺序表和单链表…

加密狗软件有什么作用?

加密狗软件是一种用于加密和保护计算机软件和数据的安全设备。它通常是一个硬件设备&#xff0c;可以通过USB接口连接到计算机上。加密狗软件的作用主要体现在以下几个方面&#xff1a; 软件保护&#xff1a;加密狗软件可以对软件进行加密和授权&#xff0c;防止未经授权的用户…

K8S:kubectl陈述式、声明式资源管理及金丝雀部署

文章目录 一.陈述式资源管理方法1.陈述式资源管理概念2.基本信息查看&#xff08;1&#xff09;查看版本信息&#xff08;2&#xff09;查看资源对象简写&#xff08;3&#xff09;查看集群信息&#xff08;4&#xff09;配置kubectl自动补全&#xff08;5&#xff09;node节点…

【Java实战项目】【超详细过程】—大饼的图片服务器4

目录 1.引入servlet依赖2.处理客户端请求2.1 上传图片2.1.1.获取图片属性写入数据库&#xff08;1&#xff09;创建factory对象和fileUpload对象为获取图片信息做准备&#xff08;2&#xff09;将获取到的文件信息存到列表items中&#xff08;3&#xff09;获取列表items中第一…

无涯教程-JavaScript - XNPV函数

描述 XNPV函数返回的现金Stream量表的净现值不一定是周期性的。要计算一系列定期现金Stream量的净现值,请使用NPV函数。 语法 XNPV (rate, values, dates)争论 Argument描述Required/OptionalRateThe discount rate to apply to the cash flows.RequiredValues 与日期付款时…

(已解决)AttributeError: module ‘cv2.gapi.wip.draw‘ has no attribute ‘Text‘

问题描述 今天再跑Caption-Anything项目的时候&#xff0c;最开始的时候就报了这样一个错误&#xff1a;AttributeError: module cv2.gapi.wip.draw has no attribute Text。 Caption-Anything是一种多功能的图像处理工具&#xff0c;结合了Segment Anything&#xff0c;Visual…

前端项目开发流程

一 参加需求对称(评审)会议 时间&#xff1a;在产品设计完成以后&#xff0c;进入正式的开发流程之前 组织者&#xff1a;产品&项目经理 目的&#xff1a;统一大家对产品的认识&#xff0c;及时发现产品设计缺陷&#xff0c;尽可能降低后续修改需求的频率 参与者&#xff…

短信验证码的登录注册功能

1 基于session实现登录流程 1.1发送验证码&#xff1a; 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff0c;如果不合法&#xff0c;则要求用户重新输入手机 如果手机号合法&#xff0c;后台此时生成对应的验证码&#xff0c;同时将验证码进行保存&#xff0c;然…

【计算机视觉 | 目标检测】干货:目标检测常见算法介绍合集(二)

文章目录 十六、EfficientDet十七、Deformable DETR十八、YOLOX十九、Sparse R-CNN二十、Contour Proposal Network二十一、VarifocalNet二十二、Libra R-CNN二十三、Stand-Alone Self Attention二十四、ThunderNet二十五、Hierarchical Transferability Calibration Network二…

垃圾收集算法

1.如何判断对象是否存活&#xff1f; 1.1引用计数算法 基本思路&#xff1a; 在对象中添加一个引用计数器每当有一个地方引用它的时候&#xff0c;计数器就加1每当有一个引用失效的时候&#xff0c;计数器就减-1当计数器的值为0的时候&#xff0c;那么该对象就是可被GC回收的…

leetcode 2366. Minimum Replacements to Sort the Array(数组排序的最少替换数)

数组nums中的元素nums[ i ] 可以替换为任意两个数a, b, 前提是ab nums[ i ]. 把数组nums变为升序&#xff08;可以有相等&#xff09;数组需要多少次替换。 思路&#xff1a; 排序数组是左边的元素<右边元素&#xff0c;以右边元素为边界。 所以从右到左遍历数组&#xf…

第二章 网络应用

第一节 计算机网络应用体系结构 三种类型&#xff1a; 1. 客户/服务器&#xff08;c/s&#xff09;结构 最主要的特征是通信只在客户与服务器之间进行&#xff0c;客户与客户之间不进行直接通信。 2. P2P(Peer to Peer) 结构 每个对等端都同时具备C/S应用的客户与服务器的…