Python respond to HTTP Request

2019-03-11 05:20发布

问题:

I am trying to do something that I assume is very simple, but since I am fairly new to Python I haven't been able to find out how. I need to execute a function in my Python script when a URL is called.

For example, I would visit the following URL in my browser (192.168.0.10 being the IP of the computer I am running the script on, and 8080 being the port of choice).

http://192.168.0.10:8080/captureImage

When this URL is visited, I would like to perform an action in my Python script, in this case execute a function I made.

I know this might be fairly simple, but I haven't been able to find out how this can be done. I would appreciate any help!

回答1:

This is indeed very simple to do in python:

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()

Depending on where you want to go from here, you might want to checkout the documentation for BaseHttpServer, or look into a more full featured web framework like Django.



回答2:

One robust way of accomplishing what you need is to use a Python web framework, Flask (http://flask.pocoo.org/). There are Youtube videos that do a good job of explaining Flask basics (https://www.youtube.com/watch?v=ZVGwqnjOKjk).

Here's an example from my motion detector that texts me when my cat is waiting by the door. All that needs to be done to trigger this code is for an HTTP request at the address (in my case) 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 = [['YourPhoneNumber@tmomail.net', '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 = 'yourGmailUserName@gmail.com'
       password = 'yourGmailPassword'
       app.run(host='0.0.0.0', threaded=True)