【问题标题】:How do you call a python function instead of a script using a form?如何使用表单调用 python 函数而不是脚本?
【发布时间】:2015-08-10 19:01:38
【问题描述】:

我一直在阅读“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 请求。您可以向您的 python 文件发出后台请求,并在该页面上获取结果。
  • 经典 CGI 是每个请求一个进程(POSTGET),因此您只需将脚本名称作为代码的入口点。较新的模型(例如 FastCGI 和 WSGI)允许 Python 进程跨请求持续存在,并且服务器可以将函数调用中继到您的代码中。
  • 谢谢tripleee,我去看看WSGI :)

标签: python html cgi


【解决方案1】:

不确定您是否已经想到了,但我会使用 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2018-08-04
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多