【远程调用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测试结果
相关推荐
PieroPc9 分钟前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
向前看-3 小时前
验证码机制
前端·后端
梧桐树04294 小时前
python常用内建模块:collections
python
Dream_Snowar4 小时前
速通Python 第三节
开发语言·python
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
蓝天星空6 小时前
Python调用open ai接口
人工智能·python
jasmine s6 小时前
Pandas
开发语言·python
郭wes代码6 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
leaf_leaves_leaf6 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零16 小时前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志