2015-05-28 25 views
2

我一直在閱讀「Head First Python」這本書,其中作者談到了使用他創建的名爲'yate'的模板創建動態網頁,這是一個HTML模板引擎(我在下面的代碼中將其更名爲site_yate)。他通過的例子是一位假想的教練,希望他的運動員能夠在線查看他們的時間。設計如下:首先你進入主頁,該主頁有一個鏈接來運行一個腳本,它會生成一個網頁,你可以在其中選擇你想查看的時間的運動員。然後,當你選擇你的運動員,然後點擊提交表格調用另一個名爲「site_generate_timing_data.py」的腳本,你可以在其中查看運動員的最佳時間。所以我決定採取進一步措施,增加功能爲運動員添加時間,在我的python腳本中使用這些額外的代碼行。如何調用python函數而不是使用表單的腳本?

print(site_yate.do_form("addtime.py", [athlete_id])) 

的HTML,這將產生將是這樣的:

<form action="addtime.py" method="POST"> 
<h1>Want to add a time?</h1> 
<input type="Text" name="1" size=40> //"1" is the athlete's id in this example 
<input type="Submit" value="Submit"> 
</form> 

正如你可以看到這個代碼調用腳本 'addtime.py',這具有下面的代碼:

import cgi 
import sqlite3 

data = cgi.FieldStorage().value[0] #this attribute will be in the form MininFieldStorage(name, value) 
id = data.name #this attribute is the input's name i.e. athlete's id 
time = data.value #this attribute is the input's value i.e. the time 

connection = sqlite3.connect("NUACDB.sqlite") #my DB's name 
cursor = connection.cursor() 
cursor.execute("""INSERT INTO timing_data (athlete_id, time) 
       VALUES (?, ?)""", 
       (id, time)) #just SQL stuff 
connection.commit() 
connection.close() 

哪些工作正常,但是我想對此做一些改變,因爲它將用戶留在空白頁面上。我可以生成一些HTML代碼來提供到主頁等的鏈接,甚至可以自動將用戶重定向到JavaScript代碼,但我希望這個腳本不含HTML,這樣我就可以在其他地方使用它了。

我想要做的是讓腳本在同一頁面上執行。不僅如此,我還希望如果我可以將addtime.py代碼作爲另一個名爲'athtemtemodel.py'的模塊的函數並在那裏調用它,即athletemodel.addtime()(或者我可以做from athletemodel import addtime,這樣我可以調用函數直)。我如何使用HTML代碼調用python函數?我知道onsubmit=""表單屬性,但顯然這是針對JavaScript函數的。我不確定的另一件事是,表單中提交的數據是否仍然可以通過CGI FieldStorage訪問,因此我的addtime.py代碼是否仍然可以正常工作。

這東西太混亂了!所有的幫助表示讚賞。

+0

閱讀上的AJAX請求。你可以向你的python文件發出後臺請求,並在該頁面上獲得結果。 – shashwat

+0

經典CGI是每個請求('POST'或'GET')的一個進程,因此您只需將腳本名稱作爲代碼的入口點。更新的模型,如FastCGI和[WSGI](http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface)允許Python進程跨越請求持續存在,並且服務器可以將函數調用轉發到您的代碼中。 – tripleee

+0

感謝tripleee,我會檢查WSGI :) – alexmerezas

回答

0

不知道你是否已經記住了,但我會使用ajax(記得包括jQuery庫)。這裏有一個粗糙例子,如果這是你想要的,可以讓你開始。這將讓他們在同一頁上:

JavaScript文件:

$('#submitButtonId').click(function (event) { 
     event.preventDefault(); 
     $('#submitButtonId').hide(); 
     $('#thinking').show(); //some div with a nice ajax loader gif... 
     $.ajax({ 
      type: 'POST', 
      data: $('#formId').serialize(), 
      url: '/URL_path_to_function', 
      success: function (data) { 
       $('#loading').hide(); 
       var response = data.result //now do stuff with your response 
       } 
      error: function(error){ 
        console.log('Error')} 
     }); 

Python的視圖/功能:

import jsonify 
if request.method == 'POST': 
    value = request.form['input value'] #flask... 
    #Do stuff 
    return jsonify(result='Some response') 
相關問題