【远程调用PythonAPI-flask】

文章目录


前言

解决Pycharm运行Flask指定ip、端口更改无效的问题

首先先创建一个新的flask项目,这里用的python是Anaconda中创建的虚拟环境,Pycharm是2024.2.1版本

一、Pycharm创建flask项目

这里PC上已经安装下载好了Anaconda,创建一个目录(用于创建虚拟环境并存储flask项目),打开Anaconda Powershell Prompt,进入该目录。

1.创建虚拟环境

按照conda命令创建虚拟python环境以及切换:

  • 创建虚拟环境:
bash 复制代码
conda create -n 环境名 python=版本号
  • 查看所有环境
bash 复制代码
conda info --envs
  • 切换到刚创建的环境
    (base变成之前新建的环境名,就代表切换成功)
bash 复制代码
conda activate 环境名

2.创建flask项目

  • 在当前目录下载安装好flask需要的所有包
  • 命令如下:(pip或者pip3都行,能使用镜像下载,命令后加上镜像源地址即可,如下)
bash 复制代码
# 安装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
bash 复制代码
#其他镜像源
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请求,浏览器不能直接访问,想要检验接口是否成功可以选择命令行方式

    或者使用命令行的方式也能访问(目前为止只能本机上进行访问)
bash 复制代码
#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的代码如下:

python 复制代码
from flask import Flask, jsonify, request
app = Flask(__name__)

@app.route('/api/sum', methods=['POST'])
def sum_numbers():
    data = request.json
    result = 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 防火墙

  1. 打开控制面板:

    点击"开始"按钮,然后在搜索框中输入"控制面板"并打开它。

    在控制面板中,点击"系统和安全"下的"Windows Defender 防火墙"。

    进入高级设置:

  2. 在左侧菜单中,点击"高级设置"

  3. 创建新的入站规则:

    在"Windows Defender 防火墙与高级安全"窗口中,点击左侧的"入站规则",然后在右侧点击"新建规则"。

  4. 选择规则类型:

    在"新建入站规则向导"中,选择"端口",然后点击"下一步"。

    指定端口:

  5. 选择"TCP",然后在"特定本地端口"中输入5000,点击"下一步"。

    设置操作:

    选择"允许连接",然后点击"下一步"。

  6. 配置文件:

    选择你想要应用规则的配置文件(通常是"域","专用"和"公用"),然后点击"下一步"。

  7. 命名规则:

    给你的规则起一个名字(例如"Allow Port 5000"),并提供一个描述(可选),然后点击"完成"。

在设置完防火墙规则后,你可以使用 Test-NetConnection 命令来测试端口是否已经开放

bash 复制代码
Test-NetConnection -ComputerName localhost -Port 5000

如果是在另一台PC中,可以修改【localhost 】为flaskPC端的IP来尝试是否能远程访问,如图:为true代表访问成功。

3.SpringBoot远程调用PythonAPI

python 复制代码
from flask import Flask, jsonify, request
app = Flask(__name__)

@app.route('/api/sum', methods=['POST'])
def sum_numbers():
    data = request.json
    result = 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配置类
java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
  • SpringBoot-控制层
java 复制代码
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-业务接口类
java 复制代码
public interface DeepKeService {
    int callPythonSumApi(int numbers);
}
  • SpringBoot-业务实现类
java 复制代码
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;
    
    @Override
    public 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测试结果
相关推荐
凤枭香2 分钟前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
码农派大星。6 分钟前
Spring Boot 配置文件
java·spring boot·后端
测试杂货铺9 分钟前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
艾派森13 分钟前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
小码的头发丝、39 分钟前
Django中ListView 和 DetailView类的区别
数据库·python·django
杜杜的man1 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*1 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu1 小时前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s1 小时前
Golang--协程和管道
开发语言·后端·golang
为什么这亚子1 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算