我一直在閱讀「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代碼是否仍然可以正常工作。
這東西太混亂了!所有的幫助表示讚賞。
閱讀上的AJAX請求。你可以向你的python文件發出後臺請求,並在該頁面上獲得結果。 – shashwat
經典CGI是每個請求('POST'或'GET')的一個進程,因此您只需將腳本名稱作爲代碼的入口點。更新的模型,如FastCGI和[WSGI](http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface)允許Python進程跨越請求持續存在,並且服務器可以將函數調用轉發到您的代碼中。 – tripleee
感謝tripleee,我會檢查WSGI :) – alexmerezas