1

Diese Frage kommt von this one.Wie HTTP 303 von Python zurückgeben?

Was ich will, ist in der Lage, die HTTP 303 Header aus meinem Python-Skript, wenn der Benutzer auf eine Schaltfläche klickt. Mein Skript ist sehr einfach und so weit wie Ausgang betrifft, ist es nur druckt die folgenden zwei Zeilen:

print "HTTP/1.1 303 See Other\n\n" 
print "Location: http://192.168.1.109\n\n" 

Ich habe auch viele verschiedene Varianten der oben (mit einer unterschiedlichen Anzahl von \r und \n versuchte das Ende der Zeilen), aber ohne Erfolg; bisher bekomme ich immer Internal Server Error.

Sind die beiden oben genannten Zeilen ausreichend, um eine HTTP 303 Antwort zu senden? Sollte es noch etwas anderes geben?

+0

Haben Sie http://stackoverflow.com/q/6122957/3001761 gelesen? – jonrsharpe

+0

Danke John! Ja, habe ich, aber es löst mein Problem nicht. Anstelle von 'Internal Server Error' bekomme ich eine Seite, die den Text' Location: http: // 192.168.1.109' enthält, anstatt auf diese Seite umgeleitet zu werden. – panos

+0

Also habe ich mir das Apache-Fehlerprotokoll angeschaut und sehe, dass es keinen Fehler gibt, wenn die erste Zeile 'Status: 303 Siehe anderes \ n' ist. Also ist diese andere Frage in diesem Teil richtig. Die zweite Zeile ('Location: ...') scheint jedoch nicht zu funktionieren ... – panos

Antwort

0

Typischerweise Browser sehen /r/n/r/n am Ende einer HTTP-Antwort.

+0

Habe es auch mal versucht, aber kein Glück ... :( – panos

1

Angenommen, Sie verwenden cgi (2.7) (3.5)

Das folgende Beispiel auf die gleiche Seite umleiten soll. Das Beispiel versucht nicht, Header zu analysieren, zu prüfen, welcher POST gesendet wurde, es leitet einfach auf die Seite '/' um, wenn ein POST erkannt wird.

# python 3 import below: 
# from http.server import HTTPServer, BaseHTTPRequestHandler 
# python 2 import below: 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
import cgi 
#stuff ... 
class WebServerHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     try: 
      if self.path.endswith("/"): 
       self.send_response(200) 
       self.send_header('Content-type', 'text/html') 
       self.end_headers() 

       page ='''<html> 
         <body> 
         <form action="/" method="POST"> 
         <input type="submit" value="Reload" > 
         </form> 
         </body> 
         </html''' 

       self.wfile.write(page) 
     except IOError: 
      self.send_error(404, "File Not Found {}".format(self.path)) 
    def do_POST(self): 
     self.send_response(303) 
     self.send_header('Content-type', 'text/html') 
     self.send_header('Location', '/') #This will navigate to the original page 
     self.end_headers() 

def main(): 
    try: 
     port = 8080 
     server = HTTPServer(('', port), WebServerHandler) 
     print("Web server is running on port {}".format(port)) 
     server.serve_forever() 

    except KeyboardInterrupt: 
     print("^C entered, stopping web server...") 
     server.socket.close() 


if __name__ == '__main__': 
    main() 
+0

Danke Michal! Ich erhalte einen Fehler though :('name 'self' ist nicht definiert. 'Ich benutze python2. – panos

+0

@panos, dies ist ein mehr selbst (haha) enthaltenes Beispiel von dem, was Sie erreichen wollen. –

+0

@panos sollte es Python zwei kompatibel jetzt sein –

Verwandte Themen