2014-02-17 2 views
2

저는 python과 html에 매우 익숙하며 파이썬 (cgi로)을 사용하여 simplehttpserver를 실행하려고했습니다. 이 서버에서 사용자 geolocation을 표시하는 location.py 파일을 실행할 수 있습니다. 나는이 위치를 가져 와서 내 PC의 텍스트 파일에 쓰고 싶지만이 작업을 수행하는 방법을 모른다. 현재 내 location.py는 실제로 html5 페이지이며 python으로로드되지만이 페이지에서 필요한 정보를 추출하는 방법을 알지 못합니다.html에서 python으로 정보 전달하기

p.s. 이 영감은 내 아이폰과 내 랩톱이 동일한 와이파이 네트워크 (임시 휴대용 핫스팟)를 공유하고 내 랩톱이 Google Earth에서 내 아이폰의보다 정확한 GPS를 사용하도록하는 것입니다. 이것은 결국 현재의 lat와 long으로 지속적으로 업데이트되는 kml 파일에 작성하려고합니다. 이 작업을 수행하는 데 더 쉬운 방법이있을 수 있지만 파이썬을 조금 배우는 것이 좋은 아이디어라고 생각했습니다.

내 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); 
    } 
    else{x.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를 사용하여 다음 위치로 단절에 다시 요청을 보내고 필요 귀하의 스크립트는 데이터를 얻을 수 있습니다. 요청을 보내려면 자바 스크립트 코드를 약간 수정해야합니다.

내가 당신에게 (내 PC에서 위치 정보 해달라고 원인 : P를) 다시 정적 데이터를 전송하는 예를 보여, 당신은 위도 경도 데이터를 올바른 를 보내도록 변경해야

(아마도 기능 showPosition 내부에?)

다음으로, 파이썬 스크립트에 대한 변경 (또한 자바 스크립트에이 chnages되어 있는지 확인하시기 바랍니다!) : 당신이 코드를 실행하면

#!/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); 
    } 
    else{x.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 당신이 coords.

물론 두 개의 스크립트로 프로세스를 분할하고 (거의 올바른 접근 방식을!) 두 번째 스크립트 (save_location.py?)에 요청을 보낼 수 있습니다.

+0

정확하게 해결되었습니다. 나는 여분의 javascript를 showposition 함수로 옮기고 그 수를 '+ position.coords.latitude +'로 바 꾸었습니다. 그것은 꿈처럼 일했습니다. 괜찮으 시다면 두 개의 스크립트가있는 것에 대해 조금 더 설명해주십시오. 나는 새로운 Python을 두 번째 스크립트에 넣고 실행 시키면 (아마도 매우 순진하게) 시도해 보았습니다. 일단 실행하면 처음에는 작동하지만 작동하지 않는 것 같습니다. 또한, 매번 save 스크립트를 수동으로 실행하는 것보다 클리너에 대해 생각하고 있다고 상상해보십시오! 다른 스크립트에서 내 저장 스크립트를 참조해야합니까? –

+1

모든 저장 부분을 (예를 들어) ** save_location.py **라는 스크립트로 옮기고 cgi 디렉토리에 넣을 수 있습니다. javascrit를 호출하면 req.open ('GET', ' 'location.py? ...);'req.open ('GET ','save_location.py? ...) '에 대해. 이 호출은 AJAX를 사용하여 수행되므로 비동기 적이므로 최소한 사용했을 때는 출력이 표시되지 않습니다. AJAX를 배우려면 http://www.w3schools.com/ajax/ajax_intro.asp 또는 http://www.webmonkey.com/2010/02/ajax_for_beginners/를 확인하는 것이 좋습니다. –

관련 문제