web-dev-qa-db-ja.com

Python Flaskボタンを使用して関数を呼び出す

flaskテンプレートのボタンが押されたら、app.pyで定義された関数をpython関数内で次のように入力して、テンプレート内で呼び出します。

App.pyの関数の例:

@app.route('/foo')
def foo(x,y):
    pass
app.jinja_env.globals.update(foo=foo)

テンプレート:

<button  type="button" onclick="myFunction(this)" name="enable" id="{{counter}}"> Enable </button>

私のボタンには、多くの正しいボタンが次のようなjavascriptを使用して押されていることをテストするためにonclick属性があります:

{% block scripts %}
    {{ super() }}
    <script>
    function myFunction(elem){
        if(confirm('Are you sure you want to ' + elem.name) == true){
            alert("its done.");            
         }
         else { 
            return false;
         }          
    }
    </script>
{% endblock %}

私が直面している問題は、正しいボタンに対応するためにテンプレート内で利用できるようにする機能が必要だということです。たとえば、ボタンに[有効化]と表示されている場合は、既に定義されている有効化関数を呼び出す必要があります。

私は正しい方向に向かっているように感じますが、この部分を通り抜けることはできません。できるだけ詳しく説明してください。

9
Sean

サーバーへのリクエストを生成せずに関数を実行する場合は、関数をJavaScriptで定義する必要があります。それ以外の場合は、HTTP要求を起動する必要があります。

今、あなたの場合、あなたがしようとしているのがボタンを有効/無効にするだけであれば、javascriptですべてを行うのが理にかなっています(サーバーに行く必要はありません)。

例:

<button type="button" onclick="disableButton(this)" name="enable">Enable</button>

javascript

function disableButtonState(elem) {
    if(confirm('Are you sure you want to disable this button?') == true) {
        elem.disabled = true;
        alert("its done.");            
    }
    else { 
        return false;
    }          
}
</script>

ただし、たとえば、メールを送信するサーバー上のメソッドを呼び出す場合は、form POST/GETまたはAJAX POST/GETを使用する必要があります。

例:

app.py

@app.route('/foo', methods=['GET', 'POST'])
def foo(x=None, y=None):
    # do something to send email
    pass

テンプレート

<form action="/foo" method="post">
    <button type="submit" value="Send Email" />
</form>

「メールを送信」ボタンをクリックすると、HTTP POSTリクエストがアプリケーションの「/ foo」に送信されます。関数fooはリクエストからデータを抽出できるようになりました。サーバー側でやりたいことを何でもしてから、クライアントのWebブラウザーに応答を返します。

Flask Tutorial を読んで、Flaskで構築されたWebアプリケーションに関してクライアント/サーバーの相互作用をよりよく理解することをお勧めします。

16
junnytony