2013-10-17 20 views
10

Sto provando a fare qualcosa che presumo sia molto semplice, ma dato che sono abbastanza nuovo in Python non sono stato in grado di scoprire come. Ho bisogno di eseguire una funzione nel mio script Python quando viene chiamato un URL.Python risponde alla richiesta HTTP

Ad esempio, vorrei visitare il seguente URL nel mio browser (192.168.0.10 è l'IP del computer su cui sto eseguendo lo script e 8080 è la porta di scelta).

http://192.168.0.10:8080/captureImage 

Quando questo URL è visitato, vorrei eseguire un'azione nel mio script Python, in questo caso eseguire una funzione che ho fatto.

So che questo potrebbe essere abbastanza semplice, ma non sono stato in grado di scoprire come questo può essere fatto. Gradirei qualsiasi aiuto!

+0

Per cominciare, avrete bisogno di un server web. Hai già un server web installato e funzionante su quel computer? –

+0

se stai usando windows questo link potrebbe funzionare http://stackoverflow.com/questions/3179657/python-webbrowser-question –

+0

Penso che tu mi abbia frainteso. Vorrei che lo script Python agisse come una sorta di server web, tranne che non ho bisogno di servire alcun file. Devo essere in grado di eseguire una funzione quando un client visita un URL sul server. – Lazze

risposta

7

Questo è davvero molto semplice da fare 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() 

A seconda di dove si vuole andare da qui, si potrebbe desiderare di checkout la documentazione per BaseHttpServer, o guardare in un framework web piena funzionalità più come Django.

+0

Questo è esattamente quello che stavo cercando, grazie! Tuttavia, sto correndo in un altro problema. Quando avvii lo script con il tuo codice, il server web interrompe l'esecuzione del resto dello script. Questo è un problema dal momento che ho bisogno di eseguire una funzione dal mio script quando viene chiamato l'URL. Come andrei a ripararlo? – Lazze

+0

@Lazze - Ho aggiornato l'esempio per includere una chiamata di funzione, è d'aiuto? Per chiarire, è il problema che vuoi che il webserver gestisca solo una richiesta e poi si spenga? Oppure il problema è che c'è un codice dopo la riga httpd.serve_forever() che non viene mai eseguita? (in tal caso, è sufficiente spostare la riga httd.server_forever() fino alla fine del tuo script) –

+0

Esiste un codice che non viene mai eseguito dopo il servizio serve_forever(). Proverò a spostarlo in fondo al mio script quando torno a casa, riferirò. Grazie per l'aiuto finora! – Lazze

-1

Un modo efficace per ottenere ciò che serve è utilizzare un framework web Python, Flask (http://flask.pocoo.org/). Ci sono video di YouTube che fanno un buon lavoro di spiegazione delle basi di Flask (https://www.youtube.com/watch?v=ZVGwqnjOKjk).

Ecco un esempio del mio rilevatore di movimento che mi invia messaggi quando il mio gatto è in attesa davanti alla porta. Tutto ciò che deve essere fatto per attivare questo codice è per una richiesta HTTP all'indirizzo (nel mio caso) 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) 
Problemi correlati