帆软FineReport与Python-API实现实时调用

最近遇到很头疼的问题,作为一名专门使用FR的数据分析师,我只会python、js和sql,而写出来的python脚本,又不能被FR直接使用,就很难受。后来经过摸索,我想到可以用python制作API,然后通过FR的JS脚本调用这个API不就实现了实时调用,下面我将演示我的实现过程。

注意:以下为Windows环境中的演示,API为GET请求

STEP1.使用Python的Falsk框架编写API接口

注意修改一下你的IP和端口

# -*- coding: UTF-8 -*-
# @Author : JW-Panda-数据分析师

from flask import Flask  # 框架
from flask_cors import CORS  # 实现跨域
from gevent import pywsgi  # 使用WSGI启动服务
import win32api, win32gui  # 静默运行
import time, os  # 时间及控制台命令
import logging  # 日志记录

# 静默模式运行
ct = win32api.GetConsoleTitle()
hd = win32gui.FindWindow(0, ct)
win32gui.ShowWindow(hd, 0)

# Flask 架构
app = Flask(__name__)  # 获取实例
CORS(app)  # 解决跨域问题


def check_pid(port):
    """
    查找被占用端口并杀掉重置
    :param port: 端口号
    :return: 无返回
    """
    try:
        r = os.popen("netstat -ano | findstr " + port)
        PID = r.read().split()[-1]
        print("端口占用,关闭端口重新执行。")
        os.system("taskkill /PID " + str(PID) + " /T /F")
    except:
        print('端口未被占用,API正常运行')
        pass


def save_record():
    logging.basicConfig(filename='.\Api_use.log',
                        filemode='a', level=logging.INFO, datefmt='%a, %d %b %Y %H:%M:%S')


# <a>是带参传入,如果有参数则放到这里,<int:a>表示传入int类型,多参数用“/”依次往后
@app.route("/test/<a>", methods=["GET"])  # 指定外网访问的路径和方式
def test(a):  # a是带参传入
    # 此处放入python程序
    runtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    if a:
        pass
    x = str(runtime) + "_test_" + str(a)
    logging.info(x)
    return x  # x为需要返回的数据


if __name__ == '__main__':
    """
    关于本机IP,可以通过cmd的【ipconfig】查找以太网适配器的ipv4地址,可能需要提前设置UDP转发
    关于端口号:可以通过cmd的【netstat】命令,根据ip找到对应的端口,自定义一个从来没从过的,范围[0-65535],避开常用
    """
    print('{:-^30}'.format('接口开始运行'))
    save_record()  # 开始记录日志
    host = '111.111.111.111'  # 这里替换你的IP
    port = '55333'  # 这里替换你的端口
    check_pid(port)  # 检查端口占用
    print('http://{}:{}/'.format(host, int(port)))
    server = pywsgi.WSGIServer((host, int(port)), app)  # 使用WSGI启动服务
    server.serve_forever()
    # app.run(host="10.1.175.107", port=62013, debug=True)  # 默认,调试使用

STEP2.测试API是否生效

API的URL地址构成是:http(或者https)://IP:端口/程序函数/参数

比如IP是111.111.111.111,端口12345,函数名demo,参数两个,为a和b,那么URL即为:

http://111.111.111.111:12345/demo/a/b

直接在浏览器访问,如果能返回结果,说明没问题了。

比如我在上面源码中展示的实例,如果你运行返回如下结果,说明没问题了。

同时,还会在这个脚本的同位置生成日志文档,用记事本打开 

 

STEP3.部署python脚本实现自动运行

这里我们使用的是Windows自带的计划任务管理。

1.在服务器中找到计划任务管理

 2.新建一个计划任务,名称随意起,主要设置什么时候运行,运行什么就行

常规:在安全选项中设置为不管用户是否登录都要运行,且勾选不储存密码

 触发器:按照你的计划,什么时候开始,或者隔几个小时开始,记得勾选“已启用”,否则不生效,这里我设置每天零点零一分重置一次

 操作:这里设置的就是你的脚本位置,除了脚本的位置,还要在起始于设置脚本的文件夹位置

以上即可, 其他的根据需要设置吧。这样就实现了服务器每日重置计划,避免突然失效了

STEP4.帆软编写JS实现调用

这里我做了一个参数输入,一个按钮,一个结果输出,使用填报模式预览

参数输入框控件,控件名称为textEditor1,值是一个公式【int(rand()*100)】,生成1-100的随机数

结果输出框控件,控件名称为textEditor0,除此之外没做任何修改

按钮控件,控件名称无所谓,新建一个点击事件,选择JavaScript脚本,下面是代码:

注意匹配一下控件名称、接口URL一致

// 获取参数(如果有)
var canshu = _g().parameterEl.getWidgetByName("textEditor1").getValue();
// 目标网址
const url = 'http://你的IP:你的端口/你的函数名/' + canshu;
// 创建一个新的 XMLHttpRequest 对象
const xhr = new XMLHttpRequest();
// 设置请求方法和目标 URL
xhr.open('GET', url, true);
// 监听请求状态变化
xhr.onreadystatechange = function () {
  // 当请求状态为完成时
  if (xhr.readyState === XMLHttpRequest.DONE) {
    // 确保请求成功
    if (xhr.status === 200) {
      console.log('Response:', xhr.responseText);
      // 赋予控件实际值
      kongjian= _g().parameterEl.getWidgetByName("textEditor0");
      kongjian.setValue("Response:"+xhr.responseText,false);
    } else {
      console.error('Error:', xhr.status, xhr.statusText);
    }
  }
};
// 发送请求
xhr.send();
// 刷新页面
setTimeout(function() {_g().parameterCommit(); }, 500)

预览之后,如果得到下面的结果:

则为这个API可以正常使用了,接下来你可以自己对python脚本和js脚本做修改,实现随意接收参数和自定义函数进行数据处理啦!! 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值