Saya baru mengenal python dan Flask. Saya memiliki Flask Web App dengan sebuah tombol. Ketika saya mengklik tombol tersebut, saya ingin mengeksekusi metode python, bukan metode Javascript. Bagaimana saya bisa melakukan ini?
Saya telah melihat contoh dengan python di mana python mengarahkan saya ke halaman baru menggunakan tag form seperti ini
<form action="/newPage" method="post">
tetapi saya tidak ingin mengarahkan saya ke halaman baru. Saya hanya ingin mengeksekusi metode python. Saya membuat ini untuk mobil robot Raspberry Pi. Ketika saya menekan tombol maju, saya ingin menjalankan metode untuk memutar roda ke depan.
Kode HTML Tombol (index.html)
<button name="forwardBtn" onclick="move_forward()">Forward</button>
Kode app.py sederhana - metode move_forward() terletak di sini
#### App.py code
from flask import Flask, render_template, Response, request, redirect, url_for
app = Flask(__name__)
@app.route("/")
def index():
return render_template('index.html');
def move_forward():
#Moving forward code
print("Moving Forward...")
Saya telah melihat pertanyaan serupa dengan pertanyaan saya di Stackoverflow, tetapi mereka tampaknya tidak menjawab pertanyaan saya atau saya tidak dapat memahami jawabannya. Jika seseorang dapat memberikan saya cara sederhana untuk memanggil metode Python pada event klik tombol, itu akan sangat dihargai.
Pertanyaan lain yang telah saya lihat:
--https://stackoverflow.com/questions/30899484/python-flask-calling-functions-using-buttons
--https://stackoverflow.com/questions/40583347/calling-a-python-function-with-a-button
--https://stackoverflow.com/questions/21566649/flask-button-run-python-without-refreshing-page
Anda bisa melakukan ini dengan bantuan AJAX... Berikut ini adalah contoh yang memanggil fungsi python yang mencetak halo tanpa mengarahkan ulang atau menyegarkan halaman.
Dalam app.py, letakkan segmen kode di bawah ini.
//rendering the HTML page which has the button
@app.route('/json')
def json():
return render_template('json.html')
//background process happening without any refreshing
@app.route('/background_process_test')
def background_process_test():
print "Hello"
return "nothing"
Dan halaman json.html Anda akan terlihat seperti di bawah ini.
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type=text/javascript>
$(function() {
$('a#test').bind('click', function() {
$.getJSON('/background_process_test',
function(data) {
//do nothing
});
return false;
});
});
</script>
//button
<div class='container'>
<h3>Test</h3>
<form>
<a href=# id=test><button class='btn btn-default'>Test</button></a>
</form>
</div>
Di sini ketika Anda menekan tombol Test simple di konsol Anda dapat melihat "Hello" ditampilkan tanpa ada penyegaran.
Kedengarannya Anda ingin menggunakan aplikasi web ini sebagai remote control untuk robot Anda, dan masalah intinya adalah Anda tidak ingin halaman dimuat ulang setiap kali Anda melakukan tindakan, dalam hal ini, tautan terakhir yang Anda posting menjawab masalah Anda.
Saya pikir Anda mungkin salah memahami beberapa hal tentang Flask. Pertama, Anda tidak dapat menyarangkan beberapa fungsi dalam satu rute. Anda tidak membuat sekumpulan fungsi yang tersedia untuk rute tertentu, Anda mendefinisikan satu hal spesifik yang akan dilakukan server ketika rute itu dipanggil.
Dengan mengingat hal itu, Anda akan dapat menyelesaikan masalah Anda dengan memuat ulang halaman dengan mengubah app.py Anda menjadi seperti ini:
from flask import Flask, render_template, Response, request, redirect, url_for
app = Flask(__name__)
@app.route("/")
def index():
return render_template('index.html')
@app.route("/forward/", methods=['POST'])
def move_forward():
#Moving forward code
forward_message = "Moving Forward..."
return render_template('index.html', forward_message=forward_message);
Kemudian di html Anda, gunakan ini:
<form action="/forward/" method="post">
<button name="forwardBtn" type="submit">Forward</button>
</form>
... Untuk mengeksekusi kode bergerak maju Anda. Dan sertakan ini:
{{ forward_message }}
... di mana Anda ingin pesan bergerak maju muncul di templat Anda.
Ini akan menyebabkan halaman Anda dimuat ulang, yang tidak dapat dihindari tanpa menggunakan AJAX dan Javascript.
index.html (index.html harus berada di folder template)
<!doctype html>
<html>
<head>
<title>The jQuery Example</title>
<h2>jQuery-AJAX in FLASK. Execute function on button click</h2>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"> </script>
<script type=text/javascript> $(function() { $("#mybutton").click(function (event) { $.getJSON('/SomeFunction', { },
function(data) { }); return false; }); }); </script>
</head>
<body>
<input type = "button" id = "mybutton" value = "Click Here" />
</body>
</html>
test.py
from flask import Flask, jsonify, render_template, request
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/SomeFunction')
def SomeFunction():
print('In SomeFunction')
return "Nothing"
if __name__ == '__main__':
app.run()