web-dev-qa-db-fra.com

Python Flask appel de fonctions à l'aide de boutons

Une fois que le bouton de mon modèle flask est enfoncé, je voudrais qu'il appelle une fonction python définie dans app.py que j'ai créée pour être disponible pour être appelé dans le modèle en tapant ce qui suit ci-dessous où je définis la fonction:

Exemple de fonction dans app.py:

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

Modèle:

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

Dans mon bouton, j'ai l'attribut onclick juste pour tester que le bon bouton sur plusieurs est pressé en utilisant javascript comme tel:

{% 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 %}

Le problème auquel je suis confronté est que j'ai besoin de la fonction que je mets à disposition dans le modèle pour correspondre au bon bouton. Par exemple, si le bouton dit Activer, alors je dois appeler la fonction d'activation déjà définie ou sinon si le bouton correspond à faux, j'aimerais que la fonction de désactivation soit utilisée.

J'ai l'impression de me diriger dans la bonne direction mais je ne peux pas dépasser cette partie. Veuillez être aussi détaillé que possible.

9
Sean

Si vous souhaitez exécuter votre fonction sans générer de requête au serveur, votre fonction doit être définie en JavaScript. Sinon, vous devez déclencher une requête HTTP.

Maintenant, dans votre cas, si tout ce que vous essayez de faire est d'activer/désactiver les boutons, il serait logique de faire tout cela en javascript (pas besoin d'aller sur le serveur).

Exemple:

<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>

Cependant, si vous voulez appeler une méthode sur votre serveur qui, par exemple, envoie un e-mail, vous devez utiliser un form POST/GET ou AJAX POST/GET

Exemple:

app.py

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

modèle

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

Lorsque vous cliquez sur le bouton "Envoyer un e-mail", une requête HTTP POST est envoyée à "/ foo" sur votre application. Votre fonction foo peut désormais extraire certaines données de la requête et faire tout ce qu'il veut faire côté serveur, puis renvoyer une réponse au navigateur Web client.

Cela suggérerait de passer par le Flask Tutorial pour avoir une meilleure compréhension des interactions client/serveur en ce qui concerne les applications web construites avec Flask.

16
junnytony