2016-10-24 8 views
0

私はフラスコでプログラミングするのが初めてです。私の質問が素朴であれば謝りますが、私は確かに簡単なアイデアだとは思えません。Flaskの関数にテキストを渡そうとしています

文字列を入力して関数に変換できる入力を作成しようとしています。誰かが* X + 5 2に入るもしそうなら、私は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

これはFlaskにとって本当にユニークではありません。 Python *を使って文字列*から関数を作成する方法を研究しましたか?グーグル*文字列から関数を作成する*ここに出発点を与える必要があります。 –

+0

これを行うことは、あなたがユーザー入力用に独自のパーサを書くのでなければ*本当に*、*本当に*悪い考えです。特に信頼されていないWebユーザーからの任意のコードの実行は、セキュリティで保護することは不可能です。 – davidism

答えて

0

これはフラスコに固有のものではないが、 Pythonでは、文字列内でコードを実行するには、execを使用します。しかし、これは非常に簡単に悪用可能なセキュリティリスクであるため、これを(特にWebサーバーのコンテキストで)使用することは、一般に悪い習慣とみなされます。

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関数はその辞書の値を設定し、変数と値のディクショナリで対応する値に変換される英数字のトークンをパーサに追加します。

前にパーサーを作成していないのであれば、この質問では細かいことがわかりませんが、それを調べるには数分かかることをお勧めします。恐ろしいかもしれない。

はなぜわざわざ:これはあなたが書いているWebアプリケーションのためであれば、あなたは安全にevalユーザーの入力ができ非常に少ない状況がある - それは、ほぼ間違いなく悪い考えですが。これは、evalを使用するセキュリティリスクなしに任意の数式を実行する方法です。

関連する問題