试图将文本传递给Flask中的函数

时间:2016-10-24 18:22:03

标签: python html forms flask

我刚接触烧瓶编程,所以如果我的问题很幼稚,我会道歉,但我似乎无法弄清楚我确信这是一个简单的想法。

我正在尝试创建一个输入,您可以在其中输入字符串,并将其转换为函数。因此,如果有人输入2 * x + 5,我可以创建f(x)= 2 * x +5

这是我到目前为止所做的:

@app.route('/test1')
def test2():
    return render_template("template_test.html")

@app.route('/test1', methods = ['POST'])
def test2_post():
    text = request.form['text']

    def f(x):
        return text

    return f(10)

2 个答案:

答案 0 :(得分:1)

比使用eval更安全:您可以使用将解析数学表达式的库 - 添加额外奖励,如果输入不是有效的数学表达式,您可以向输入它的用户提供有意义的错误消息。请参阅Evaluating a mathematical expression in a string - 特别是this answer,它提供了一个可以像这样使用的手动解析器:

def test2_post():
    text = request.form['text']
    nsp = NumericStringParser()
    nsp.set_variable('x', 10) # you'll have to implement this method
    result = nsp.eval(text)
    return(result)

关键答案之上和之外的一件事是提供一种设置变量的方法。您必须扩展该答案中给出的代码 - 我的建议是在NumericStringParser对象中保留变量和值的字典。 set_variable函数设置该字典中的值,并在解析器中添加一个字母数字标记,该标记将转换为变量和值字典中的相应值。

如果您以前没有使用过编写解析器的问题,那么这个问题的范围有点超出我提供详细信息的范围 - 但我鼓励您花几分钟时间来研究它,它并不可怕看起来似乎。

为什么要这么麻烦:如果这是针对您正在撰写的网络应用,那么您可以安全eval用户输入的情况非常少 - 这几乎绝对是一个坏主意。这是一种执行任意数学表达式的方法,没有使用eval的安全风险。

答案 1 :(得分:0)

虽然这不是特定于烧瓶的,但在python中,可以使用{{1}}来完成在字符串中执行代码;但是,使用它通常被认为是不好的做法(特别是在Web服务器环境中),因为它是一种非常容易被利用的安全风险。