Flask - Düğme OnClick olayında python işlevini çağırma

Python ve Flask'ta yeniyim. Bir düğme ile bir Flask Web Uygulamam var. Düğmeye tıkladığımda bir Javascript yöntemi değil bir python yöntemi çalıştırmak istiyorum. Bunu nasıl yapabilirim?

Python ile aşağıdaki gibi bir form etiketi kullanarak beni yeni bir sayfaya yönlendirdiği örnekler gördüm

<form action="/newPage" method="post">

ama beni yeni bir sayfaya yönlendirmesini istemiyorum. Sadece python yöntemini çalıştırmasını istiyorum. Bunu bir Raspberry Pi robot arabası için yapıyorum. İleri düğmesine bastığımda, tekerlekleri ileri çevirmek için yöntemi çalıştırmasını istiyorum.

Düğme HTML Kodu (index.html)

<button name="forwardBtn" onclick="move_forward()">Forward</button>

basit app.py Kodu - move_forward() yöntemi burada bulunur

#### 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...")

Stackoverflow'da benimkine benzer sorular gördüm, ancak soruma cevap vermiyorlar ya da cevabı anlayamıyorum. Birisi bana düğme tıklama olayında bir Python yöntemini çağırmanın basit bir yolunu sağlayabilirse, çok takdir edilecektir.

Baktığım Diğer Sorular:

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

Bunu AJAX yardımıyla basitçe yapabilirsiniz... İşte sayfayı yeniden yönlendirmeden veya yenilemeden merhaba yazdıran bir python işlevini çağıran bir örnek.

app.py dosyasına aşağıdaki kod parçasını yerleştirin.

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

Ve json.html sayfanız aşağıdaki gibi görünmelidir.

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

            <a href=# id=test>Test</a>


</div>

Burada Test simple düğmesine bastığınızda konsolda "Hello&quot görebilirsiniz; herhangi bir yenileme olmadan görüntüleniyor.

Yorumlar (0)

Bu web uygulamasını robotunuz için bir uzaktan kumanda olarak kullanmak istiyorsunuz gibi görünüyor ve temel bir sorun, her eylem gerçekleştirdiğinizde sayfanın yeniden yüklenmesini istememenizdir, bu durumda gönderdiğiniz son bağlantı sorununuzu yanıtlar.

Sanırım Flask ile ilgili birkaç şeyi yanlış anlıyor olabilirsiniz. Birincisi, tek bir rotaya birden fazla fonksiyon yerleştiremezsiniz. Belirli bir rota için bir dizi işlevi kullanılabilir hale getirmiyorsunuz, bu rota çağrıldığında sunucunun yapacağı belirli bir şeyi tanımlıyorsunuz.

Bunu göz önünde bulundurarak, app.py dosyanızı aşağıdaki gibi değiştirerek sayfanın yeniden yüklenmesi ile ilgili sorununuzu çözebilirsiniz:

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

Sonra html'nizde şunu kullanın:


    Forward

...İlerleme kodunuzu çalıştırmak için. Ve bunu ekleyin:

{{ forward_message }} 

... ileriye taşıma mesajının şablonunuzda görünmesini istediğiniz yer.

Bu, AJAX ve Javascript kullanmadan kaçınılmaz olan sayfanızın yeniden yüklenmesine neden olacaktır.

Yorumlar (1)

index.html (index.html templates klasöründe olmalıdır)





    The jQuery Example

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



        <input type = "button" id = "mybutton" value = "Click Here" />


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()
Yorumlar (0)