帆软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')


# 是带参传入,如果有参数则放到这里,表示传入int类型,多参数用“/”依次往后
@app.route("/test/", 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

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

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

帆软FineReport与Python-API实现实时调用_第1张图片

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

帆软FineReport与Python-API实现实时调用_第2张图片

 

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

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

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

帆软FineReport与Python-API实现实时调用_第3张图片

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

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

帆软FineReport与Python-API实现实时调用_第4张图片

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

帆软FineReport与Python-API实现实时调用_第5张图片

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

帆软FineReport与Python-API实现实时调用_第6张图片

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

STEP4.帆软编写JS实现调用

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

帆软FineReport与Python-API实现实时调用_第7张图片

参数输入框控件,控件名称为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脚本做修改,实现随意接收参数和自定义函数进行数据处理啦!! 

你可能感兴趣的:(python,开发语言)