2017-12-02 34 views
0

저는 웹 서버를 가지고 놀고 CGI 모듈을 사용하여 파이썬 루틴을 호출했습니다. 그것은 도전적 이었지만 잘 작동합니다.CGI 파이썬 스크립트가 실행 된 후 어떻게 자동으로 홈페이지로 돌아갈 수 있습니까?

내 문제는 파이썬 스크립트 실행 후입니다, 내 홈 페이지로 다시 리다이렉트하는 스크립트에 루틴을 소개하고 싶습니다.

이 포럼 질문에서이 답변을 보았습니다. 대부분의 경우 대답은 명령 줄 print("Location:http://your_page")을 사용하지만 이미 trie를 사용하고 있으며 제 경우에는 작동하지 않습니다.

다음 단락에서 나는 전체 "미니 프로젝트"를 설명하려고 시도하고 나서 코드를 보도록하겠습니다.

인터넷을 통한 무선 홈 시스템의 원격 제어. 언어 Python과 PHP, 리눅스 지식 O.S.

  • 이 프로젝트의 목적은 웹 페이지 (인터넷 연결)의 버튼을 클릭하면 LED를 켜고 끄는 것입니다. LED는 가정의 어딘가 무선 모듈에 있습니다.

  • BeagleBone Black (Debian O.S.)에서 실행중인 Apache2 웹 서버 설정하기. Beagle Bone Black은 UTP 케이블을 통해 LAN에 연결됩니다.

  • ESP32 모듈을 TCP 서버로 프로그래밍하고 Wi-Fi (LAN)에도 연결합니다.

  • 프로그래밍 된 ESP32 모듈과 TCP 클라이언트 연결을 실행하고 LED를 켜고 끄는 CGI 모듈로 구성된 Python 스크립트. 웹 페이지에서 버튼을 클릭하면 스크립트가 실행됩니다.

  • 인터넷에서 Web Server에 액세스 할 수 있도록 모뎀/라우터에서 포트를 앞으로 설정합니다.

index.html을 (홈 페이지)

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Web Server MReyesP!</title> 
    <style> 
     .button { 
     padding: 15px 25px; 
     font-size: 24px; 
     text-align: center; 
     cursor: pointer; 
     outline: none; 
     color: #fff; 
     background-color: #4CAF50; 
     border: none; 
     border-radius: 15px; 
     box-shadow: 0 9px #999; 
     } 
     .button:hover {background-color: #3e8e41} 
     .button:active { 
     background-color: #3e8e41; 
     box-shadow: 0 5px #666; 
     transform: translateY(4px); 
     } 
    </style> 
    </head> 
    <body> 
    <h1>Success! The Web Server is working :)</h1> 
    <h2>Click the Button to run - "LED On/Off program"</h2> 
    <input class=button onClick="location.href='http://my_web_page.net/cgi-bin/TCPC$ 
    </body> 
</html> 

이 내 결과 홈 페이지. 내 파이썬 스크립트는 루틴을 실행하지만 다시 내 홈 페이지로 리디렉션하지 않는 결과로 Home page

python_script.py

#!/usr/bin/python3 

import socket 
import time 
import cgitb 
cgitb.enable() 

print("Content-type: text/html\n\n") 
print("<html>\n<body>") 
print("<div style=\"with:100%; font-size: 40px; font-weight bold; text-align: c$ 
print("The LED was turned On and after 2 seconds was turned Off") 
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
ip="192.168.2.112" 
port=1234 
address=(ip,port) 
client.connect(address) 
data = 'led_on' 
client.sendall(data.encode('utf-8')) 
time.sleep(2) 
data = 'led_off' 
client.sendall(data.encode('utf-8')) 
client.close() 
print("Location: http://my_web_page.net/\n") 
print("</div>\n</body>\n</html>") 

. 다음 이미지에서 결과를 직접 볼 수 있습니다. 이 웹 페이지는 영원히 남습니다.

Final web page

당신이 어떤 생각을 가지고 있습니까? 내 홈페이지로 돌아가려면 파이썬 코드에 무엇을 삽입해야합니까?

감사합니다. 정말로 시간과 도움에 감사드립니다.

참고 : 당신이 당신의 자신의 출력 리디렉션을 인쇄하려면 당신은 리디렉션을 수행하는 사용자의 응답에 간단한 자바 스크립트의 조각을 방출 할 필요가

+0

간단한 방법은 CGI 스크립트가 현재의 LED 상태와 같이 표시하려는 추가 정보와 함께 페이지를 다시 작성하는 것입니다. [이 오래된 대답] (https://stackoverflow.com/a/26059792/4014959)은 _may_가 당신을 위해 일하는 또 다른 방법을 보여줍니다. 죄송합니다. 파이썬 2에 있지만, 쉽게 수정할 수 있어야합니다. FWIW, CGI는 요즘 매우 고풍스러운 것으로 간주되지만, 단순한 것들에 대해서는 여전히 편리하다고 생각합니다. 그러나 그렇게 간단하지 않은 것들에 대해서는 금방 고통스러워집니다. ;) –

+0

'입력 클래스 = 버튼 onClick = "location.href = 'http : // my_web_page.net/cgi-bin/TCPC $'<- 그 라인이 맞지 않습니다 ... – dda

답변

0

파이썬 3.거야 사용하고 있습니다.

CGI에서 출력 할 필요가 없다면 머리말을 끝내는 double \ n \ n을 인쇄하기 전에 Location : 헤더를 인쇄해야합니다. 301 또는 302 응답 코드를 설정하려면 "의사"헤더 Status :를 추가해야합니다.

+0

내가 제안한대로 문장 인쇄 ("Content-type : text/html \ n \ n") 이전의 문장 인쇄 ('위치 : http://my_home_page.net/\n')와 완벽하게 작동하면 홈 페이지를 절대 버리지 않은 것과 같습니다 어쨌든, "자바 스크립트"의 작은 예제를 게시 할 수 있겠습니까? 내 생각은 CGI 페이지에 "코드가 실행되었고 홈 페이지로 3 초 안에 리디렉션됩니다"라는 메시지가 표시됩니다. 다시 감사합니다 !!!! – mreyesp