2013-10-17 2 views
10

제가 생각하기에 무언가를하려고하는 것은 매우 간단합니다. 그러나 저는 파이썬을 처음 접했기 때문에 어떻게 찾을 수 없었습니다. URL이 호출 될 때 파이썬 스크립트에서 함수를 실행해야합니다.파이썬이 HTTP 요청에 응답했습니다.

예를 들어, 브라우저에서 다음 URL을 방문합니다 (192.168.0.10은 스크립트를 실행중인 컴퓨터의 IP이고 8080은 선택 포트 임).

http://192.168.0.10:8080/captureImage 

이 URL을 방문 할 때, 나는 내가 만든 기능을 실행이 경우, 내 파이썬 스크립트에서 작업을 수행하고 싶습니다.

이 방법은 상당히 간단 할 수도 있지만이 방법을 찾을 수 없었습니다. 나는 어떤 도움을 주셔서 감사합니다!

+0

시작하려면 웹 서버가 필요합니다. 해당 컴퓨터에 이미 웹 서버가 설치되어 실행되고 있습니까? –

+0

이 링크가 작동하는 창을 사용하는 경우 http://stackoverflow.com/questions/3179657/python-webbrowser-question –

+0

나는 당신이 나를 오해 한 것 같아요. Python 스크립트가 어떤 파일을 제공 할 필요가 없다는 점을 제외하고는 일종의 웹 서버처럼 작동하고 싶습니다. 클라이언트가 서버의 URL을 방문 할 때 함수를 실행할 수 있어야합니다. – Lazze

답변

7

이 파이썬에서 할 참으로 아주 간단하다 :

import SocketServer 
from BaseHTTPServer import BaseHTTPRequestHandler 

def some_function(): 
    print "some_function got called" 

class MyHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     if self.path == '/captureImage': 
      # Insert your code here 
      some_function() 

     self.send_response(200) 

httpd = SocketServer.TCPServer(("", 8080), MyHandler) 
httpd.serve_forever() 

당신이 여기에서 가고 싶은 위치에 따라, 당신은 BaseHttpServer에 대한 문서를 체크 아웃, 또는 더 완전한 기능을 갖춘 웹 프레임 워크로 볼 수도 있습니다 장고처럼.

+0

그게 내가 찾고 있던 바로 그거야, 고마워! 그러나 다른 문제가 있습니다. 코드로 스크립트를 시작하면 웹 서버는 나머지 스크립트 실행을 중지합니다. 이것은 URL이 호출 될 때 스크립트에서 함수를 실행해야하기 때문에 문제가됩니다. 어떻게 해결할 수 있을까요? – Lazze

+0

@Lazze - 함수 호출을 포함하도록 예제를 업데이트했습니다. 도움이 될까요? 명확하게하기 위해 웹 서버가 하나의 요청 만 처리 한 다음 종료하도록하려는 문제가 있습니까? 아니면 절대 실행되지 않는 httpd.serve_forever() 라인 다음에 코드가 있다는 문제가 있습니까? (이 경우 httd.server_forever() 줄을 스크립트의 끝으로 옮길 수 있습니다. –

+0

serve_forever() 뒤에 실행되지 않는 코드가 있습니다. 내가 집에 갈 때 스크립트의 맨 아래로 옮겨보고 다시보고 할 것이다. 지금까지 도움을 주셔서 감사합니다! – Lazze

-1

필요한 작업을 수행하는 한 가지 확실한 방법은 Python 웹 프레임 워크 인 Flask (http://flask.pocoo.org/)를 사용하는 것입니다. 플라스크 기본 (https://www.youtube.com/watch?v=ZVGwqnjOKjk)을 잘 설명하는 Youtube 비디오가 있습니다.

다음은 내 고양이가 문 옆에서 기다리고있을 때 텍스트를 보내는 동작 탐지기의 예입니다. 이 코드를 실행하기 위해 수행해야하는 모든 작업은 주소의 HTTP 요청에 대한 것입니다. (내 경우) http://192.168.1.112:5000/cat_detected

from flask import Flask 
    import smtplib 
    import time 


    def email(from_address, to_address, email_subject, email_message): 
     server = smtplib.SMTP('smtp.gmail.com:587') 
     server.ehlo() 
     server.starttls() 
     server.login(username, password) 
     # For character type new-lines, change the header to read: "Content-Type: text/plain". Use the double \r\n. 
     # For HTML style tags for your new-lines, change the header to read: "Content-Type: text/html". Use line-breaks <br>. 
     headers = "\r\n".join(["from: " + from_address, "subject: " + email_subject, 
         "to: " + to_address, 
         "mime-version: 1.0", 
         "content-type: text/plain"]) 
     message = headers + '\r\n' + email_message 
     server.sendmail(from_address, to_address, message) 
     server.quit() 
     return time.strftime('%Y-%m-%d, %H:%M:%S') 


    app = Flask(__name__) 


    @app.route('/cat_detected', methods=['GET']) 
    def cat_detected(): 
     fromaddr = 'CAT ALERT' 
     admin_addrs_list = [['[email protected]', 'Mark']] # Use your carrier's format for sending text messages via email. 
     for y in admin_addrs_list: 
      email(fromaddr, y[0], 'CAT ALERT', 'Carbon life-form standing by the door.') 
     print('Email on its way!', time.strftime('%Y-%m-%d, %H:%M:%S')) 
     return 'Email Sent!' 

    if __name__ == '__main__': 
     username = '[email protected]' 
     password = 'yourGmailPassword' 
     app.run(host='0.0.0.0', threaded=True)