从按钮执行异步Python脚本
我在树莓派上安装了一个比较标准的LAMP环境。
我有一个带有指示器和按钮的HTML界面。我正在使用Jquery来读取服务器上的文本文件,并把内容显示在指示器上,同时希望按钮能够调整这些指示器的值。
我的实现方式是用一个表单,里面有按钮,这些按钮可以通过cgi运行一个Python脚本。我的想法是让Python脚本去修改Jquery正在读取的那个文件。还有其他脚本在服务器上运行,它们会读取这个文本文件来控制硬件,所以这个中间文件非常重要。
问题是,运行Python脚本后,页面会被重定向。我只希望脚本能够在后台静默执行,不影响页面。
谢谢。
1 个回答
0
这里的答案可以通过cgi或wsgi来实现,方法是用一个非常简单的ajax调用。回头看这个问题,感觉挺有趣的。
在这个例子中,jquery用来在sqlite数据库上执行查询:
function wsgiCallbackTableData (database,table,callback) {
// Get the data
//alert(database + ' ' + table + ' ' + callback)
$.ajax({
url: "/wsgisqlitequery",
type: "post",
datatype:"json",
data: {'database':database,'table':table},
success: function(response){
//alert("I worked");
// Execute our callback function
callback(response);
}
});
}
然后是python代码:
def application(environ, start_response):
import cgi
import json
from pilib import dynamicsqliteread, sqlitequery
post_env = environ.copy()
post_env['QUERY_STRING'] = ''
post = cgi.FieldStorage(
fp=environ['wsgi.input'],
environ=post_env,
keep_blank_values=True
)
formname=post.getvalue('name')
data={}
d={}
for k in post.keys():
d[k] = post.getvalue(k)
status = '200 OK'
# Run stuff as requested
if 'length' in d: # Handle table row subset
data=dynamicsqliteread(d['database'],d['table'],d['start'],d['length'])
elif 'row' in d: # Handle table row
data=dynamicsqliteread(d['database'],d['table'],d['row'])
elif 'table' in d: # Handle entire table
data=dynamicsqliteread(d['database'],d['table'])
elif 'query' in d: # Take plain single query
result=sqlitequery(d['database'],d['query'])
data=result
elif 'queryarray[]' in d: # Take query array, won't find
result=[]
for query in d['queryarray[]']:
result.append(sqlitequery(d['database'],query))
data=result
else:
data=['empty']
output = json.dumps(data,indent=1)
response_headers = [('Content-type', 'application/json')]
start_response(status,response_headers)
return [output]
pilib包含了一组非常基础的sqlite命令,这些命令被打包成一个动态调用。