如何使用表单调用python函数而不是脚本?

时间:2015-05-28 10:18:34

标签: python html cgi

我一直在阅读“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代码是否仍然可以正常工作。

这个东西太混乱了!感谢所有帮助。

1 个答案:

答案 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')