将信息从html传递到python
Posted
技术标签:
【中文标题】将信息从html传递到python【英文标题】:Pass information out of html to python 【发布时间】:2014-02-17 23:05:09 【问题描述】:我对python和html非常陌生,我一直在尝试使用python(使用cgi)运行一个简单的httpserver。从这台服务器我可以运行一个 location.py 文件来显示用户的地理位置。然后我想把这个位置写到我电脑上的一个文本文件中,但我不知道该怎么做。目前我的 location.py 实际上是一个由 python 加载的 html5 页面,但我不知道如何从我的这个页面中提取所需的信息。
附:这样做的灵感是让我的 iphone 和我的笔记本电脑共享同一个 wifi 网络(adhoc 便携式热点),然后让我的笔记本电脑在谷歌地球中使用我的 iphone 更准确的 gps。这我最终想写入一个 kml 文件,该文件会不断更新我当前的纬度和经度。可能有更简单的方法可以做到这一点,但我认为学习一点 Python 会是个好主意。
我的 location.py 文件
#!/python
print( "Content-type: text/html\n\n")
print( """\
<html>
<head>
<p id="demo">Test:</p>
<script>
var x=document.getElementById("demo");
function getLocation()
if (navigator.geolocation)
navigator.geolocation.getCurrentPosition(showPosition);
elsex.innerHTML="Geolocation is not supported by this browser.";
function showPosition(position)
x.innerHTML="Latitude: " + position.coords.latitude +
"<br>Longitude: " + position.coords.longitude;
window.onload = getLocation;
</script>
</head>
<body>
</body>
</html>""")
还有我的服务器文件(webserver.py)
import http.server
def main():
server_address = ("", 8000)
handler = http.server.CGIHTTPRequestHandler
handler.cgi_directories = ['/python']
server = http.server.HTTPServer(server_address, handler)
try:
server.serve_forever()
except KeyboardInterrupt:
server.socket.close()
if __name__ == '__main__':
main()
【问题讨论】:
【参考方案1】:您需要将请求发送回您的服务器并提供该位置,然后在您的脚本中使用cgi.FielStorage
来获取数据。要发送请求,您必须稍微修改一下您的 javascipt 代码。
我向您展示了一个发送静态数据的示例(因为我的 PC 上没有地理位置:P),您需要更改它以发送正确的 lat,lon 数据(可能在函数内部showPosition
?)
接下来,更改您的 python 脚本(请检查 javascript 上是否也有更改!):
#!/usr/bin/env python
import cgi
form = cgi.FieldStorage()
lat = form.getvalue('lat')
lon = form.getvalue('lon')
with open('location.txt','wt') as f:
if lat:
f.write(lat)
f.write("\n")
if lon:
f.write(lon)
f.close()
print( "Content-type: text/html\n\n")
print( """\
<html>
<head>
<p id="demo">Test:</p>
<script>
var x=document.getElementById("demo");
function getLocation()
//this is to send the location back to your python script
var req = new XMLHttpRequest();
req.open('GET', 'location.py?lat=1&lon=2', false);
req.send(null);
//----------------------------------------------
if (navigator.geolocation)
navigator.geolocation.getCurrentPosition(showPosition);
elsex.innerHTML="Geolocation is not supported by this browser.";
function showPosition(position)
x.innerHTML="Latitude: " + position.coords.latitude +
"<br>Longitude: " + position.coords.longitude;
window.onload = getLocation;
</script>
</head>
<body>
</body>
</html>""")
如果您运行代码,您会在文件 location.txt 上看到您有坐标。
当然,您可以将进程拆分为两个脚本(几乎可以肯定是正确的方法!)并将请求发送到您的第二个脚本(save_location.py 或许?)。
【讨论】:
这完全解决了它。我将多余的 javascript 移到了 showposition 函数中,并将数字替换为“+ position.coords.latitude+”。它像梦一样工作。如果您不介意,您会解释一下有关拥有两个脚本的更多信息。我尝试(可能非常天真)只是将新的 python 放在第二个脚本中,并在我运行第一个脚本时运行它,但这似乎不起作用。另外,我想您正在考虑一个清洁器,而不是每次都必须手动运行保存脚本!我需要在我的其他脚本中引用我的保存脚本吗? 您可以将所有保存部分移动到一个名为(例如)save_location.py 的脚本并放入 cgi 目录,然后在您从 javascrit 调用时,您需要将req.open('GET', 'location.py?...);
更改为req.open('GET', 'save_location.py?...);
。您应该记住,此调用是使用 AJAX 执行的,因此它是异步的,至少在您使用它时您不会看到任何输出。我建议你检查这个w3schools.com/ajax/ajax_intro.asp 或webmonkey.com/2010/02/ajax_for_beginners 来学习 AJAX,最好的问候以上是关于将信息从html传递到python的主要内容,如果未能解决你的问题,请参考以下文章