【远程调用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测试结果
相关推荐
禹凕1 分钟前
Python编程——进阶知识(MYSQL引导入门)
开发语言·python·mysql
Victor3561 分钟前
MongoDB(2)MongoDB与传统关系型数据库的主要区别是什么?
后端
JaguarJack2 分钟前
PHP 应用遭遇 DDoS 攻击时会发生什么 从入门到进阶的防护指南
后端·php·服务端
BingoGo2 分钟前
PHP 应用遭遇 DDoS 攻击时会发生什么 从入门到进阶的防护指南
后端
阿钱真强道3 分钟前
13 JetLinks MQTT:网关设备与网关子设备 - 温控设备场景
python·网络协议·harmonyos
Victor3564 分钟前
MongoDB(3)什么是文档(Document)?
后端
我的xiaodoujiao7 分钟前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 47--设置Selenium以无头模式运行代码
python·学习·selenium·测试工具·pytest
牛奔2 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
寻星探路6 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
想用offer打牌7 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp