从Flask调用任意Python函数的更优雅的方法

从Flask调用任意Python函数的更优雅的方法,python,flask,Python,Flask,设置烧瓶REST API很容易。我采用以下方法: from flask import Flask from flask_cors import CORS from utility import * app = Flask(__name__) cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) @app.after_request def add_headers(res

设置烧瓶REST API很容易。我采用以下方法:

from flask import Flask
from flask_cors import CORS

from utility import *

app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})

@app.after_request
def add_headers(response):
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Allow-Headers'] =  "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
    response.headers['Access-Control-Allow-Methods']=  "POST, GET, PUT, DELETE, OPTIONS"
    return response

@app.route("/", methods=["GET"])
def call_function():
    res = request_return()
    return(res)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)
在本例中,我导入了utility.py中的函数:

from flask import request, jsonify

def my_function(arg):
    return(arg)

def string_to_number(str):
    if("." in str):
        try:
            res = float(str)
        except:
            res = str
    elif(str.isdigit()):
        res = int(str)
    else:
        res = str
    return(res)

def request_return():
    passed_function = request.args.get('function')
    args = dict(request.args)
    values = list(args.values())[1:]
    values = list(map(string_to_number, values))
    res = globals()[passed_function](*tuple(values))
    return(jsonify(res))
这允许我将任何函数名作为参数传递,并返回结果。因此,如果我在浏览器中运行以下命令:

https:localhost:5000/?function=my_function&args=hello
我会看到:

"hello"
我处理请求的方式非常臃肿。您可以在request\u return中看到,我必须采取一系列步骤,从函数名移动到函数的执行和返回。我还使用一个string-to-number函数来处理可能传递的任何数字。这确保了我可以调用实用程序中的任何函数以及该函数的任意数量的参数


我看过的任何Flask教程都没有讨论如何调用这样的任意函数。有没有更优雅的方法来处理这个问题?具体来说,如果我的请求返回函数中没有所有的膨胀,允许客户端调用任何全局函数是危险的,他们可以调用
open()
来覆盖文件

创建应用程序中应可调用的操作字典

与其尝试自动转换数字,不如让各个函数决定如何解析它们的参数

my_operations = {'my_function': my_function, ...}

def request_return():
    passed_function = request.args.get('function')
    try:
        args = dict(request.args)
        del args['function'] # This is processed above
        res = my_operations[passed_function](**args)
        return(jsonify(res))
    except:
        # report error to caller

允许客户端调用任何全局函数是危险的,他们可以调用
open()
来覆盖文件

创建应用程序中应可调用的操作字典

与其尝试自动转换数字,不如让各个函数决定如何解析它们的参数

my_operations = {'my_function': my_function, ...}

def request_return():
    passed_function = request.args.get('function')
    try:
        args = dict(request.args)
        del args['function'] # This is processed above
        res = my_operations[passed_function](**args)
        return(jsonify(res))
    except:
        # report error to caller

你得到了什么样的异常?它使用了两个位置参数。似乎需要从args中删除“function”。我在15分钟前已将其添加到我的答案中。这将返回“args”而不是“hello”。抱歉,需要使用
**args
按名称传递参数。您遇到了什么异常?它包含两个位置参数。似乎需要从args中删除“function”。我在15分钟前已将其添加到我的答案中。这将返回“args”而不是“hello”。对不起,需要使用
**args
按名称传递参数。