[Python] pgsql2shp + zip + cgi + download ... bad header

Giuseppe Naponiello beppenapo a gmail.com
Sab 2 Apr 2016 23:38:43 CEST


Un saluto a tutta la comunità,
riscrivo qui in lista un post che ho scritto sul forum.
questo è il mio primo post, spero di non fare troppi errori da novellino  ;)
Dunque, sto sviluppando un'applicazione web
(apache+php+jquery+tomcat+geoserver+postgres+postgis, il tutto gira su
server debian), per alcune funzioni ho utilizzato python (finalmente ho
avuto la possibilità di studiarmelo!), ma una in particolare mi sta dando
un po' di problemi:
da una mappa con punti, linee e poligoni georeferenziati (gestiti da
postgres/postgis e pubblicati con openlayers via geoserver), l'utente fa
una ricerca e scarica i dati in diversi formati (shp, json, gml, csv).
Avrei potuto mandare una richiesta direttamente a geoserver ma volevo
evitare di inserire un pulsante di download per ogni tipo di formato
(considerate che per lo shape ho 3 diverse richieste poiché punti, linee e
poligoni sono gestiti da tabelle diverse), da qui l'idea di utilizzare
python per creare i vari file, zipparli e far partire il download cliccando
su un solo pulsante.
Ho creato le varie funzioni, e salvato il file nella cartella cgi-bin
(apache, ovviamente, è stato configurato per la gestione dei file python da
cgi-bin).
Lo script crea i vari file, crea l'archivio zip e pulisce la cartella dai
file creati lasciando solo lo zip...il problema arriva al download:
nell'error.log di apache leggo "malformed header from script 'test.py': Bad
header: Initializing..."
*L'errore sparisce e il download va a buon fine se dallo script elimino le
funzioni per la creazione degli shapefile!!! *
Per creare gli shp utilizzo pgsql2shp e credo il problema stia nel fatto
che il comando pgsql2shp produce output:

"Initializing...
Done (postgis major version: 2).
Output shape: MultiPoint
Dumping: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [5732
rows].
...
---"

La funzione completa (tralascio le cose superflue a favore di una maggiore
leggibilità) per creare gli shape è:
"punti = 'pgsql2shp -f %s%s_punti.shp -h %s -p 5432 -u %s -P %s %s "SELECT
....;"'%(path,f,host,username,password,db)
linee = 'pgsql2shp -f %s%s_linee.shp -h %s -p 5432 -u %s -P %s %s "SELECT
...;"'%(path,f,host,username,password,db)
poligoni = 'pgsql2shp -f %s%s_poligoni.shp -h %s -p 5432 -u %s -P %s %s
"SELECT ..."'%(path,f,host,username,password,db)

def shp():
    try:
      os.system(punti)
    except:
      return
    try:
      os.system(linee)
    except:
      return
    try:
      os.system(poligoni)
    except:
      return

mentre per lo zipfile e il download:

HEADERS = '\r\n'.join(["Content-type: %s;", "Content-Disposition:
attachment; filename=%s","Content-Title: %s","\r\n"])
def zipFunc(cartella,nome):
        escludi = ['*.zip']
        for dirname, subdirs, files in os.walk(cartella):
            for filename in files:
                if not filename.endswith('zip'):
                    nome.write(os.path.join(dirname, filename), filename)
                    os.remove(os.path.join(dirname, filename))
out = StringIO()
zip = zipfile.ZipFile(out, "w", zipfile.ZIP_DEFLATED)
zipFunc(path,zip)
zip.close()
out.seek(0)
sys.stdout.write(HEADERS % ('application/zip', url,f))
sys.stdout.write(out.read())
out.close()

Secondo voi è corretto pensare che il problema sia l'output prodotto da
pgsql2shp, se si come eliminare l'errore? Nella documentazione non c'è
nessuna opzione che permetta di non stampare output.
Magari esiste un'altra strada per ottenere lo stesso risultato?
Grazie a tutti

-beppe-



-- 
*Giuseppe Naponiello*

*A**rc-**T**eam srl*
piazza Navarrino, 13 - 38023Cles (TN)
C.F. e P. IVA IT-01941600221
cell. +393476846599
mail: beppenapo a arc-team.com
pec: arc-team a pec.it
101 | www.arc-team.com
110 | http://arc-team-open-research.blogspot.it/
000 | https://independent.academia.edu/GiuseppeNaponiello
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20160402/093bb0b5/attachment.html>


Maggiori informazioni sulla lista Python