2015-06-17 39 views
7

Tôi khá mới đối với Python/Flask và đặc biệt là các ngôn ngữ kịch bản, vì vậy, hãy làm việc với tôi.Chức năng gọi hàm bình thường bằng cách sử dụng các nút

Sau khi nhấn nút trong mẫu bình tôi muốn gọi hàm python được định nghĩa trong app.py mà tôi đã sẵn sàng để gọi trong mẫu bằng cách nhập phần dưới đây vào nơi tôi xác định hàm :

Ví dụ hàm trong app.py:

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

mẫu:

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

trong nút của tôi, tôi có thuộc tính onclick chỉ để kiểm tra xem nút chính xác trong số nhiều được nhấn bằng cách sử dụng javascript như vậy:

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

Vấn đề tôi đang gặp phải là tôi cần chức năng mà tôi đang cung cấp trong mẫu tương ứng với nút chính xác. Ví dụ, nếu nút nói Enable, thì tôi cần gọi hàm enable đã được định nghĩa hoặc nếu không, nếu nút tương ứng với false, tôi muốn sử dụng chức năng disable.

Tôi cảm thấy mình đang đi đúng hướng nhưng không thể vượt qua phần này. Hãy làm chi tiết nhất có thể.

Trả lời

11

Nếu bạn muốn thực thi chức năng của mình mà không cần tạo yêu cầu tới máy chủ, thì chức năng của bạn phải được xác định bằng JavaScript. Nếu không, bạn cần kích hoạt một yêu cầu HTTP.

Bây giờ trong trường hợp của bạn, nếu tất cả những gì bạn đang cố gắng làm là bật/tắt các nút, sẽ có ý nghĩa khi thực hiện tất cả những điều đó trong javascript (không cần phải truy cập máy chủ).

Ví dụ:

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

Tuy nhiên, nếu những gì bạn muốn là để gọi một phương thức trên máy chủ của bạn, ví dụ, gửi một email, sau đó bạn nên sử dụng một form POST/GET hoặc AJAX POST/GET

Ví dụ:

app.py

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

mẫu

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

Khi bạn nhấp vào nút "Gửi email" một yêu cầu HTTP POST được gửi đến "/ foo" trên ứng dụng của bạn. Chức năng của bạn foo bây giờ có thể trích xuất một số dữ liệu từ yêu cầu và làm bất cứ điều gì nó muốn làm ở phía máy chủ và sau đó trả về một phản ứng với trình duyệt web của khách hàng.

Bạn nên xem qua số Flask Tutorial để hiểu rõ hơn về tương tác của khách hàng/máy chủ khi nói đến các ứng dụng web được tạo bằng Flask.

+0

Cảm ơn bạn đã trả lời.Vì vậy, từ những gì bạn đang nói với tôi tôi chỉ cần sử dụng JavaScript cho tình hình cụ thể của tôi. Vấn đề lớn nhất mà tôi gặp phải là cố gắng gọi hàm python thực sự trong JS. bạn có thể chỉ cho tôi đúng hướng hay đưa ra một ví dụ? – Sean

+0

Bạn không thể gọi hàm python trực tiếp từ JavaScript vì trong trường hợp này, JavaScript của bạn đang chạy trên trình duyệt trên máy khách và hàm Python của bạn tồn tại trên máy chủ. Cách duy nhất để làm cho giao tiếp đó xảy ra là gửi một yêu cầu HTTP đến máy chủ của bạn. Đó là câu trả lời của tôi. Nếu những gì bạn đang cố gắng làm là hoàn toàn trực quan, chẳng hạn như vô hiệu hóa hoặc ẩn một nút thì điều này có thể đạt được hoàn toàn bằng JavaScript. Đây có phải là những gì bạn đang có ý định không? – junnytony

+0

Xem nút chỉnh sửa của tôi để thao tác với javascript, nếu đó là những gì bạn đang cố gắng làm – junnytony

Các vấn đề liên quan