我一直在阅读“Head First Python”一书,其中作者谈论使用他创建的名为'yate'的模块创建动态网页,这是一个HTML模板引擎(我在下面的代码中将其重命名为site_yate)。他通过的例子是一位假设的教练,希望他的运动员能够在线检查他们的时间。设计如下:首先进入主页,其中包含运行脚本的链接,该脚本生成一个网页,您可以在其中选择要查看其时间的运动员。然后当您选择运动员并单击提交时,表单会调用另一个名为“site_generate_timing_data.py”的脚本,您可以在其中查看运动员的最佳时间。所以我决定更进一步,添加功能,为运动员增加时间,在我的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代码作为函数放在另一个名为'athletemodel.py'的模块中并在那里调用它,即athletemodel.addtime()
(或者我可以{{1}所以我可以直接调用该函数)。如何使用HTML代码调用python函数?我知道from athletemodel import addtime
表单属性,但显然是JavaScript函数。我不确定的另一件事是表单中提交的数据是否仍然可以通过CGI FieldStorage访问,因此我的addtime.py代码是否仍然可以正常工作。
这个东西太混乱了!感谢所有帮助。
答案 0 :(得分: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')