[Python] mod_python

Manlio Perillo manlio_perillo a libero.it
Lun 23 Giu 2008 18:10:19 CEST


Cristian Re ha scritto:
> ciao a tutti ho la necessità di realizzare uno script che effettui il 
> download di files di svariato tipo, musicali, immagini, testo ecc ecc 
> con mod_python ma non riesco a capire se è fattibile e come.
> 

Dal codice non mi sembra proprio che tu stia facendo un download; tu 
vuoi servire un file.

Comunque: la documentazione di mod_python l'hai letta?

> Fin'ora ho sempre effettuato queste operazioni tramite cgi in python con 
> il seguente codice:
> naturalmente modificando il Content-Type in base al tipo di file da 
> scaricare.
> 
> 
>                 print 'Content-Type: x-music/x-midi'
>                 print 'Content-Disposition:attachment; filename=filename'
>                 print 'Content-Length: %s' % os.path.getsize(path)
>                 print
>                
>                 a = msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
>                
>                 while True:
>                     chunk = f.read(8192) # segments of 8192 bytes
>                     if not chunk: # if end of file
>                         break
>                     sys.stdout.write(chunk) # send segment
>                     sys.stdout.flush() # flush
>                
>                 f.close()
> 

Ti consiglio di lasciar stare mod_python, ed usare invece mod_wsgi.
In questo modo puoi fare:

def application(environ, start_response):
     headers = [
       ('Content-Type', 'x-music/x-midi'),
       ('Content-Disposition', 'attachment; filename=filename'),
       ('Content-Length', '%s' % os.path.getsize(path))
     ]

     start_response('200 OK', headers)

     f = file(path, 'rb')
     return environ['wsgi.file_wrapper'](f, 8192)


Maggiori informazioni qui: http://python.org/dev/peps/pep-0333/

Questo codice non solo è più "semplice" rispetto all'equivalente in 
mod_python, ma è anche portabile ad altri server (con una minima 
modifica dati che wsgi.file_wrapper è opzionale e non tutti lo 
implementano).


P.S.: ma hai davvero bisogno di servire tu il file invece di lasciarlo
       fare ad Apache?

P.S.2: se non puoi usare mod_wsgi, anche mod_python ha il supporto per
        l'invio diretto di files: request-sendfile(path[, offset, len]):

http://www.modpython.org/live/current/doc-html/pyapi-mprequest.html




Saluti  Manlio Perillo


Maggiori informazioni sulla lista Python