首页 > 编程语言 >python 服务自动生成 js 调用

python 服务自动生成 js 调用

时间:2024-03-18 11:46:40浏览次数:24  
标签:调用 return name python js axios command func

python 服务自动生成 js 调用

原理

  1. 接管请求分发过程; 为每个 command 维护对应的 handler;
  2. 利用 python 动态特性, 获得 handler 的参数;
  3. 利用模版生成 js 代码;
  4. 利用**kwargs 获取所有参数传递给 handler;

Demo

以 Flask 为例

# main.py
from flask import Flask, request
from dispatch import dispath, get_command, command_map
from js_stub import gen_js_file

app = Flask(__name__)


@app.route("/command/<command_name>", methods=['POST'])
def add(command_name):
    j = request.get_json()
    command = get_command(command_name)
    print(command(**j))
    return {
        "command": command_name,
        "result": command(**j),
    }


@dispath("add")
def _(a, b):
    return a+b


@dispath("minus")
def _(a, b):
    return a-b


if __name__ == '__main__':
    gen_js_file(command_map)
    app.run(port=3000, debug=True)

生成 js 代码如下:

import axios from "axios";

const base_url = "http://127.0.0.1:3000/command";

export async function add(a, b) {
  const r = await axios.post(`${base_url}/add`, { a, b });
  return r.data.result;
}

export async function minus(a, b) {
  const r = await axios.post(`${base_url}/minus`, { a, b });
  return r.data.result;
}

实现如下

# dispatch.py
command_map = {}


def dispath(command_name):
    def outer(func):
        command_map[command_name] = func
        return func
    return outer

def get_command(command_name):
    return command_map[command_name]
# js_stub.py


template = """
async function(){
    return axios.post('')
}
"""
base_url = "http://127.0.0.1:5000/command"


def gen_func(command_name, func):
    vars = ",".join(func.__code__.co_varnames)
    return f"""export async function {command_name}({vars}) {{
    const r = await axios.post(`${{base_url}}/{command_name}`,{{{vars}}})
    return r.data.result
}}"""


def gen_js_file(command_map):
    js_content = [
        "import axios from 'axios'",
        "const base_url='http://127.0.0.1:3000/command'"
    ]

    for command_name, func in command_map.items():
        js_content.append(gen_func(command_name, func))

    content = '\n\n'.join(js_content)
    with open('./gen/api.js', 'w') as f:
        f.write(content)

标签:调用,return,name,python,js,axios,command,func
From: https://www.cnblogs.com/aloe-n/p/18080006

相关文章

  • python:ModuleNotFoundError: No module named 'xxx'可能的解决方案大全
    "ModuleNotFoundError:Nomodulenamed'xxx'"这个报错是个非常常见的报错,几乎每个python程序员都遇到过,导致这个报错的原因也非常多,下面是我曾经遇到过的原因和解决方案module包没安装忘了import没有__init__.py文件package包的版本不对自定义的包名与安装的包名相同,导致......
  • vue页面纯前端导出excel表格(多级表头,exceljs)
    查找对比因为是第一次实现这样的功能,先在网上进行了查找,发现了三种比较常用的方法:1.安装file-saverxlsxscript-loader如果想设置表格样式的话,需要同时安装依赖xlsx-style,通常情况下安装此依赖会报错,需要进行修改;2.安装vue-json-excel这个插件看起来比较好上手,但是好像只......
  • 基于Java的厦门旅游电子商务预订系统(Vue.js+SpringBoot)
    目录一、摘要1.1项目介绍1.2项目录屏二、功能模块2.1景点类型模块2.2景点档案模块2.3酒店管理模块2.4美食管理模块三、系统设计3.1用例设计3.2数据库设计3.2.1学生表3.2.2学生表3.2.3学生表3.2.4学生表四、系统展示五、核心代码5.1新增景点类型5.2查......
  • Python实践:基于Matplotlib实现某产品全年销量数据可视化
    本文分享自华为云社区《画图实战-Python实现某产品全年销量数据多种样式可视化》,作者:虫无涯。学习心得有时候我们需要对某些数据进行分析,得到一些可视化效果图,而这些效果图可以直观展示给我们数据的变化趋势;比如某产品的月销量数据、销售额的地区分布、销售增长和季节的变......
  • ssm/php/node/python学生竞赛模拟系统
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当前的教育环境中,学生竞赛已经成为衡量学生学术能力和创新思维的重要手段。随着科技的发展,越来越多的竞赛采用了线上模拟系统来进行,其中4x1nt学生竞赛......
  • ssm/php/node/python学生学习评价与分析系统
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在教育领域,学生的学习评价一直是教师、家长乃至学校管理者关注的重点。传统的学习评价方式主要依靠考试成绩和教师的主观观察,这种方式往往不能全面反映......
  • 注入js编程应该知道的一些基础知识,以防混淆造成的错误
    假设我现在用的是chrome extension的方式注入javascript来控制网页,例如有一个元素,原始的网页制作者已经给他注册了各种事件,但是我想得到当这个元素发生改变时,会触发一个我自己能控制的事件,有没有什么办法?要在不干扰原有网页事件的前提下,为元素添加自定义事件处理程序,你可以使用M......
  • 《手把手教你》系列技巧篇(四十)-java+ selenium自动化测试-JavaScript的调用执行-下篇(
    1.简介 在实际工作中,我们需要对处理的元素进行高亮显示,或者有时候为了看清楚做跟踪鼠标点击了哪些元素需要标记出来。今天宏哥就在这里把这种测试场景讲解和分享一下。2.用法创建一个执行JS的对象,也就是JavascriptExecutor对象,这个对象是由driver进行强制类型转......
  • Python常用内置函数
    Python常用内置函数1类型转换函数2数学相关函数3序列相关函数4对象操作函数1类型转换函数int(a,base=10)用于将一个符合数字规范的字符串或数字转换为整型,参数base表示进制数,默认为十进制,base参数仅针对a参数是字符串时使用,若a参数是数字时使用base参数则会报......
  • FastJson反序列化3-1.2.25绕过
    在1.2.25中,主要添加了config.checkAutoType(typeName,null)函数,所以从这里开始查看检查逻辑;为了方便,先看POC;publicvoidbyPass1(){Strings1="{{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},{......