2013-10-17 111 views
10

我正在尝试做一些我认为非常简单的事情,但由于我对Python相当陌生,因此我一直无法找出如何做到。我需要在调用URL时在我的Python脚本中执行一个函数。例如,我将在浏览器中访问以下URL(192.168.0.10是我正在运行脚本的计算机的IP,而8080是所选端口)。Python对HTTP请求作出响应

http://192.168.0.10:8080/captureImage 

当访问这个URL,我想在我的Python脚本执行的操作,在这种情况下执行我做了一个功能。

我知道这可能相当简单,但我一直无法找出如何做到这一点。我将不胜感激任何帮助!

+0

首先,你需要一个web服务器。您是否已经安装并在该计算机上运行了Web服务器? –

+0

如果你使用Windows这个链接可能工作http://stackoverflow.com/questions/3179657/python-webbrowser-question –

+0

我想你误解了我。我希望Python脚本充当某种Web服务器,除非我不需要提供任何文件。当客户端访问服务器上的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,或寻找到一个更全功能的Web框架像Django。

+0

这正是我正在寻找的,谢谢! 但是,我遇到了另一个问题。当我用你的代码启动脚本时,Web服务器会停止脚本的其余部分执行。这是一个问题,因为我需要在调用URL时从脚本执行一个函数。我将如何去解决这个问题? – Lazze

+0

@Lazze - 我更新了示例以包含函数调用,这有帮助吗?为了澄清,您希望Web服务器只处理一个请求然后关闭的问题?或者是从未运行的httpd.serve_forever()行之后存在代码的问题? (在这种情况下,您可以将httd.server_forever()行向下移动到脚本末尾) –

+0

在serve_forever()之后永远不会运行代码。当我回家时,我会尝试将其移到我的脚本的底部,并将回报。感谢您迄今的帮助! – Lazze

-1

完成你所需要的一种强有力的方法是使用Python Web框架Flask(http://flask.pocoo.org/)。有Youtube视频可以很好地解释Flask的基础知识(https://www.youtube.com/watch?v=ZVGwqnjOKjk)。

下面是我的动作探测器的一个例子,当我的猫在门口等待时,它给我发短信。所有需要做的事情都是为了在这个地址发送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)