【远程调用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测试结果
相关推荐
zhangbin_237几秒前
【Python机器学习】NLP信息提取——正则模式
开发语言·人工智能·python·深度学习·机器学习·自然语言处理
小李飞刀李寻欢5 分钟前
mongoDB 读取数据python版本实现
数据库·python·mongodb·数据
大脸猫吖12 分钟前
Selenium4.0实现自动搜索功能
python·selenium·自动化
你可以自己看16 分钟前
python中数据处理库,机器学习库以及自动化与爬虫
python·机器学习·自动化
kolaseen35 分钟前
pytorch的动态计算图机制
人工智能·pytorch·python·深度学习·机器学习
约束11239 分钟前
ipynb脚本是运行在本地还是云端?
python·jupyter
QXH2000001 小时前
数据预处理方法—数据标准化和数据归一化
人工智能·python·深度学习·机器学习
Passion不晚1 小时前
Spring Boot 入门:解锁 Spring 全家桶
spring boot·后端·spring
一丝晨光1 小时前
语言的循环语句
java·c++·python·c#·c·fortran·algol
NuyoahC1 小时前
Python语法(二)——函数
开发语言·笔记·python