【远程调用PythonAPI-flask】
文章目录
- 前言
- 一、Pycharm创建flask项目
- 1.创建虚拟环境
- 2.创建flask项目
- 二、远程调用PythonAPI——SpringBoot项目集成
- 1.修改PyCharm的host配置
- 2.防火墙设置
- 3.SpringBoot远程调用PythonAPI
前言
解决Pycharm运行Flask指定ip、端口更改无效的问题
首先先创建一个新的flask项目,这里用的python是Anaconda中创建的虚拟环境,Pycharm是2024.2.1版本
一、Pycharm创建flask项目
这里PC上已经安装下载好了Anaconda,创建一个目录(用于创建虚拟环境并存储flask项目),打开Anaconda Powershell Prompt,进入该目录。
1.创建虚拟环境
按照conda命令创建虚拟python环境以及切换:
- 创建虚拟环境:
conda create -n 环境名 python=版本号
- 查看所有环境
conda info --envs
- 切换到刚创建的环境
(base变成之前新建的环境名,就代表切换成功)
conda activate 环境名
2.创建flask项目
- 在当前目录下载安装好flask需要的所有包
- 命令如下:(pip或者pip3都行,能使用镜像下载,命令后加上镜像源地址即可,如下)
# 安装flask
pip3 install flask
pip3 install flask -i https://pypi.tuna.tsinghua.edu.cn/simple #清华大学# 安装flask-restful
pip3 install flask-restful# 安装flasgger
# 注意:需要更新setuptools
pip3 install -U setuptools
pip3 install flasgger# 管理数据库的依赖
pip3 install flask_script
pip3 install flask_migrate
#其他镜像源
https://mirrors.aliyun.com/pypi/simple/ #阿里云
https://mirrors.163.com/pypi/simple/ #网易
https://mirrors.huaweicloud.com/repository/pypi/simple/ #华为云
全都成功安装后打开PyCharm
- 新建项目,选择flask项目,位置选择刚刚创建的目录,以及编辑项目名称,如图:
点击创建后,会等待加载flask环境,项目加载成功后,页面会有示例的app.py,在PyCharm的右下角点击python解释器,会有conda的python虚拟环境列表,如图:选择刚刚创建的即可
然后就能成功运行了,运行后控制台会有访问网址
用网址在浏览器中直接访问即可
PS:刚开始创建的项目是GET请求,因此浏览器能直接访问,访问成功如图:
但是如果是POST请求,浏览器不能直接访问,想要检验接口是否成功可以选择命令行方式
或者使用命令行的方式也能访问(目前为止只能本机上进行访问)
#GET
curl http://127.0.0.1:5000/#POST
curl -X POST http://127.0.0.1:5000/api/sum -H "Content-Type: application/json" -d "[参数]"
二、远程调用PythonAPI——SpringBoot项目集成
1.修改PyCharm的host配置
修改app.py的代码如下:
from flask import Flask, jsonify, request
app = Flask(__name__)@app.route('/api/sum', methods=['POST'])
def sum_numbers():data = request.jsonresult = sum(data.get('numbers', []))return jsonify({'result': result})if __name__ == '__main__':app.run(host='0.0.0.0', port=5000) # 使用0.0.0.0让其他机器也能访问
-
在这里直接在run中指定项目的host访问IP和端口port,然后运行项目,会发现控制台的访问地址依旧是
[ Running on http://127.0.0.1:5000]
这是PyCharm的原因,可能有人在这一步就成功修改host配置了,修改成功后的控制台会输出
[ Running on http://0.0.0.0:5000]
这就代表其他机器也能访问该API(在防火墙以及允许端口入站的情况下,后面会说防火墙如何开启特定端口) -
代码修改host没用的话,在PyCharm的运行按钮找到运行配置——Pycharm Edit Configurations
-
点击后如果界面上能找到Additional options选项,可参考这篇博客解决Pycharm Flask(默认ip与端口不能改变与改变之后外网依旧不能访问ip的问题)
-
如果点击后跟我一样找不到Additional options选项的,可以点击界面中的【修改选项】,然后在列表中勾选【其他选项】
-
在弹出的其他选项输入框中输入【–host=0.0.0.0 --port=5000】,点击应用
-重新运行该项目,控制台会出现其他ip:5000
-
代表host配置修改成功
2.防火墙设置
使用 Windows Defender 防火墙
-
打开控制面板:
点击“开始”按钮,然后在搜索框中输入“控制面板”并打开它。
在控制面板中,点击“系统和安全”下的“Windows Defender 防火墙”。
进入高级设置: -
在左侧菜单中,点击“高级设置”
-
创建新的入站规则:
在“Windows Defender 防火墙与高级安全”窗口中,点击左侧的“入站规则”,然后在右侧点击“新建规则”。 -
选择规则类型:
在“新建入站规则向导”中,选择“端口”,然后点击“下一步”。
指定端口: -
选择“TCP”,然后在“特定本地端口”中输入5000,点击“下一步”。
设置操作:
选择“允许连接”,然后点击“下一步”。 -
配置文件:
选择你想要应用规则的配置文件(通常是“域”,“专用”和“公用”),然后点击“下一步”。 -
命名规则:
给你的规则起一个名字(例如“Allow Port 5000”),并提供一个描述(可选),然后点击“完成”。
在设置完防火墙规则后,你可以使用 Test-NetConnection 命令来测试端口是否已经开放
Test-NetConnection -ComputerName localhost -Port 5000
如果是在另一台PC中,可以修改【localhost 】为flaskPC端的IP来尝试是否能远程访问,如图:为true代表访问成功。
3.SpringBoot远程调用PythonAPI
- pythonAPI app.py
from flask import Flask, jsonify, request
app = Flask(__name__)@app.route('/api/sum', methods=['POST'])
def sum_numbers():data = request.jsonresult = sum(data.get('numbers', []))return jsonify({'result': result})if __name__ == '__main__':app.run(host='0.0.0.0', port=5000) # 使用0.0.0.0让其他机器也能访问
- SpringBoot-RestTemplateConfig配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
- SpringBoot-控制层
import com.youlai.system.common.result.Result;
import com.youlai.system.service.DeepKeService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/deepkeIE")
@RequiredArgsConstructor
public class DeepKeController {private final DeepKeService deepKeService;private final RestTemplate restTemplate;@PostMapping("/run-python-script")public Result<?> runPythonScript(@RequestParam int num) {int sum = deepKeService.callPythonSumApi(num);System.out.println("Sum from Python API: " + sum);return Result.success(sum);}
}
- SpringBoot-业务接口类
public interface DeepKeService {int callPythonSumApi(int numbers);
}
- SpringBoot-业务实现类
import com.youlai.system.service.DeepKeService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.util.HashMap;
import java.util.Map;@Service
@RequiredArgsConstructor
public class DeepKeServiceImpl implements DeepKeService {private final RestTemplate restTemplate;@Overridepublic int callPythonSumApi(int numbers) {Map<String, Object> requestData = new HashMap<>();requestData.put("numbers", new int[]{numbers});ResponseEntity<Map> response = restTemplate.postForEntity("http://192.168.0.70:5000/api/sum", requestData, Map.class);return (Integer) response.getBody().get("result");}
}
- postman测试结果