最近遇到很头疼的问题,作为一名专门使用FR的数据分析师,我只会python、js和sql,而写出来的python脚本,又不能被FR直接使用,就很难受。后来经过摸索,我想到可以用python制作API,然后通过FR的JS脚本调用这个API不就实现了实时调用,下面我将演示我的实现过程。
注意:以下为Windows环境中的演示,API为GET请求
注意修改一下你的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) # 默认,调试使用
API的URL地址构成是:http(或者https)://IP:端口/程序函数/参数
比如IP是111.111.111.111,端口12345,函数名demo,参数两个,为a和b,那么URL即为:
http://111.111.111.111:12345/demo/a/b
直接在浏览器访问,如果能返回结果,说明没问题了。
比如我在上面源码中展示的实例,如果你运行返回如下结果,说明没问题了。
同时,还会在这个脚本的同位置生成日志文档,用记事本打开
这里我们使用的是Windows自带的计划任务管理。
1.在服务器中找到计划任务管理
2.新建一个计划任务,名称随意起,主要设置什么时候运行,运行什么就行
常规:在安全选项中设置为不管用户是否登录都要运行,且勾选不储存密码
触发器:按照你的计划,什么时候开始,或者隔几个小时开始,记得勾选“已启用”,否则不生效,这里我设置每天零点零一分重置一次
操作:这里设置的就是你的脚本位置,除了脚本的位置,还要在起始于设置脚本的文件夹位置
以上即可, 其他的根据需要设置吧。这样就实现了服务器每日重置计划,避免突然失效了
这里我做了一个参数输入,一个按钮,一个结果输出,使用填报模式预览
参数输入框控件,控件名称为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脚本做修改,实现随意接收参数和自定义函数进行数据处理啦!!