Diferencia entre revisiones de «Usuario:Lmorillas/desarrollo web servidor/python cgi»

De WikiEducator
Saltar a: navegación, buscar
 
(Una revisión intermedia por el mismo usuario no mostrado)
Línea 92: Línea 92:
 
{{Conocimiento previo|
 
{{Conocimiento previo|
 
<source lang="python">
 
<source lang="python">
#!/usr/bin/python
+
#!/usr/bin/env python
  
 
# HTTP Header
 
# HTTP Header
print "Content-Type:application/octet-stream; name=\"FileName\"\r\n";
+
print 'Content-Type:application/octet-stream; name="FileName"\n'
print "Content-Disposition: attachment; filename=\"FileName\"\r\n\n";
+
print 'Content-Disposition: attachment; filename="FileName"\n\n'
  
 
# Actual File Content will go hear.
 
# Actual File Content will go hear.
Línea 109: Línea 109:
 
|Title=Lanzar descarga de archivo
 
|Title=Lanzar descarga de archivo
 
}}
 
}}
 +
 +
{{Tip|''CGI scripts run by the CGIHTTPRequestHandler class cannot execute redirects (HTTP code 302), because code 200 (script output follows) is sent prior to execution of the CGI script. This pre-empts the status code.'' http://docs.python.org/2/library/cgihttpserver.html}}

Última revisión de 17:20 22 oct 2013





Icon activity.jpg

Actividad

(Cap. 4 de Real Python for the Web, de Michael Herman)




Icon present.gif
Tip:
  • Para los ejercicios usaremos CGIHTTPServer
 python -m CGIHTTPServer
  • Los programas cgi estarán en un subdirectorio cgi-bin
  • Esos programas tienen que estar identificados como programas python
 #!/usr/bin/env python
  • Tienen que tener permisos de ejecución
 $ chmos +x <programa_cgi.py>




Icon activity.jpg

Configuración del servidor

#!/usr/bin/env python
 
import BaseHTTPServer
import CGIHTTPServer
import cgitb; cgitb.enable()  ## Para mostrar errores CGI
 
server = BaseHTTPServer.HTTPServer
handler = CGIHTTPServer.CGIHTTPRequestHandler
server_address = ("", 8000)
handler.cgi_directories = [""]  ## En qué directorios puede haber programas CGI
 
httpd = server(server_address, handler)
httpd.serve_forever()






Icon preknowledge.gif

Subir un archivo

   <form enctype="multipart/form-data" 
                     action="save_file.py" method="post">
   <p>File: <input type="file" name="filename" /></p>
   <p><input type="submit" value="Upload" /></p>
   </form>
#!/usr/bin/python
 
import cgi, os
import cgitb; cgitb.enable()
 
form = cgi.FieldStorage()
 
# Get filename here.
fileitem = form['filename']
 
# Test if the file was uploaded
if fileitem.filename:
   # strip leading path from file name to avoid 
   # directory traversal attacks
   fn = os.path.basename(fileitem.filename)
   open('/tmp/' + fn, 'wb').write(fileitem.file.read())
 
   message = 'The file "' + fn + '" was uploaded successfully'
 
else:
   message = 'No file was uploaded'
 
print """\
Content-Type: text/html\n
<html>
<body>
   <p>%s</p>
</body>
</html>
""" % (message,)





Icon preknowledge.gif

Lanzar descarga de archivo

#!/usr/bin/env python
 
# HTTP Header
print 'Content-Type:application/octet-stream; name="FileName"\n'
print 'Content-Disposition: attachment; filename="FileName"\n\n'
 
# Actual File Content will go hear.
fo = open("foo.txt", "rb")
 
str = fo.read();
print str
 
# Close opend file
fo.close()



Icon present.gif
Tip: CGI scripts run by the CGIHTTPRequestHandler class cannot execute redirects (HTTP code 302), because code 200 (script output follows) is sent prior to execution of the CGI script. This pre-empts the status code. http://docs.python.org/2/library/cgihttpserver.html