Stückweise aus StringIO lesen, wie?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 22. Februar 2006, 19:49

Ich biete per CGI Dateien zum Download an... Es sind ZIP-Dateien die mit StringIO im Speicher erzeugt werden:

Code: Alles auswählen

buffer = cStringIO.StringIO()
z = zipfile.ZipFile(buffer, "w")

for file_info in files:
    z.write(file_info)
z.close()

if simulation:
    self.request.write("-"*80)
    self.request.write("\n")

buffer.seek(0,2) # Am Ende der Daten springen
buffer_len = buffer.tell() # Aktuelle Position
buffer.seek(0) # An den Anfang springen

filename = posixpath.split(self.request_path)[-1]

if not simulation:
    self.request.headers['Content-Disposition'] = 'attachment; filename="%s.zip"' % filename
    self.request.headers['Content-Length'] = '%s' % buffer_len
    self.request.headers['Content-Transfer-Encoding'] = 'binary'
    self.request.headers['Content-Type'] = 'application/octet-stream; charset=utf-8'
    self.request.write(buffer.getvalue())
Nun überlege ich ein billiges "Traffic Shaping" bzw. throttling einzubauen... Meine Idee. Ich übertrage die Daten von buffer stückweise in self.request.write() rüber und zwischendurch mache ich ein time.sleep()...

Nur, wie lese ich Stückweise aus einem StringIO herraus?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 22. Februar 2006, 20:28

Hm! Ich ideotist...

StrinIO ist ein fileobjekt, somit kann man bröckchenweise mit .read(1024) lesen und senden...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 22. Februar 2006, 21:21

Gesagt getan... Das dumme ist nur, das es nix bring, da es als CGI läuft... Der Download bedingt erst dann, wenn alle Teile durch self.request.write() durch sind...
Also kann ich so einfach keine Bandbreiten-Beschänkung einbauen :(

Mit fastCGI oder modPython müßte das aber gehen, oder?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 22. Februar 2006, 21:23

Code: Alles auswählen

class SendDynamic(BaseApplication):
    def process_request(self):
        def send_data(self):
            from time import sleep
            for _ in xrange(20):
                sleep(0.1)
                yield "some text"
         self.request.send_response(send_data())
Sollte eigentlich auch mit cgi gehen.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 22. Februar 2006, 21:28

Jep! Das ist ja cool...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 2. März 2006, 12:51

OK, der Download funktioniert... Nun würde mich aber interessieren, ob man evtl. auch eine resume-Funktion von Download-Managern umsetzten kann?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten