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

标签 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()(或者我可以执行 from athletemodel import addtime 这样我就可以直接调用该函数)。如何使用 HTML 代码调用 python 函数?我知道 onsubmit="" 表单属性,但显然这是针对 JavaScript 函数的。我不确定的另一件事是表单中提交的数据是否仍可通过 CGI FieldStorage 访问,因此我的 addtime.py 代码是否仍能按原样工作。

这东西太困惑了!感谢所有帮助。

最佳答案

不确定您是否已经想到它,但我会使用 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 View /函数:

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

关于python - 如何使用表单调用 python 函数而不是脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30503704/

相关文章:

python - 如何在尾部没有柱子的情况下打印 Pandas 的头部和尾部

python - 如果我的 mysql 套接字不在/tmp 中,是否可以将 Mysql 与 SqlAlchemy 和 Flask 一起使用?

html - 如何使用 cgi 返回到相同的 html 页面?

Linux,共享对象中的并发

perl - 分析超时的 Perl CGI 脚本

python - 根据条件将列添加到 pyspark 数据框

python - Wordnet 同义词不返回所有值 nltk

javascript - jQuery中,如何在指定元素后加载ajax内容

html - Gmail 电子邮件样式,包装器 div 未显示

javascript - 在 contenteditable 中突出显示语法