Download Link, welcher vorher die Downloaddatei erzeugen läs

Django, Flask, Bottle, WSGI, CGI…
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Download Link, welcher vorher die Downloaddatei erzeugen läs

Beitragvon JR » Freitag 4. August 2006, 08:58

Hallo!

Lange konnte ich nicht entwickeln, nun wieder da :-)

Eine kurze Frage habe ich.
Auf einer meienr Seiten biete ich einen Downloadlink an, welcher auf eine Datei des Zopeservers verweist. Die Datei erzeuge ich derzeit beim Seitenaufbau via Pythonskript. Aus Performancegründen möchte ich, die Datei erst dann generieren, wenn jemand auf den Link drückt. Kann ich dem Link selbst eine Action zuwenden, die dann erst mein Erstellscript ruft und dann auf die frisch erstellte Datei linkt? Bei Actions muss man doch immer einen Button angeben !? Context wäre Link, doch Button??

Ich vermute, dass es irgendwie geht, nur wie? ;-)

Viele Grüße aus Berlin
JR
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Download Link, welcher vorher die Downloaddatei erzeugen

Beitragvon gerold » Freitag 4. August 2006, 10:04

JR hat geschrieben:Kann ich dem Link selbst eine Action zuwenden, die dann erst mein Erstellscript ruft und dann auf die frisch erstellte Datei linkt?

Hi JR!

Du brauchst keine besondere Action dafür. --> lass alles von einem Python-Script erledigen.

- Nachsehen, ob die Datei bereits erstellt ist.
- Wenn noch nicht erstellt --> erstellen
- Datei zurück liefern.

Falls die Datei sich ständig ändert, dann kannst du ja statt einer Datei im Dateisystem, ein StringIO-Objekt erstellen, das du befüllst und dann über das Python-Script zurück lieferst.

So funktioniert der Download:

Code: Alles auswählen

request = container.REQUEST
response = request.RESPONSE

s = (
    "Hallo Welt\n"
    "Hallo Welt"
)

response.setHeader('content-type', 'text/plain')
response.setHeader('content-length', str(len(s)))
response.setHeader('content-disposition', 'attachment; filename=hallowelt.txt')
response.write(s)

Du musst nur noch den Downloadlink auf das Python-Script zeigen lassen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Beitragvon JR » Sonntag 6. August 2006, 16:27

Hi Gerold!

Danke für deinen Tipp, doch leider ist es so, dass ich die XML-Datei auf jedem Fall auch anlegen möchte, da sie für eine Datenanzeige via XSL verwendet wird und der Anwender gleichzeitig die Möglichkeit haben soll, die Datei herunter zu laden.

Mein Script, welches die Datei jedesmal beim Aufbau der Seite (auf welcher der Link zur Datei erscheint) sieht so aus:

Code: Alles auswählen

id = 'Startliste_%s.xml' %datum

startlisten_ordner = getattr(context, 'Startlisten', None)

try:
  startlisten_ordner.manage_delObjects(id)
except:
  pass

if datum:
  xml_Header = '<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>\n<!DOCTYPE startliste SYSTEM "startliste.dtd">\n<?xml-stylesheet type="text/xsl" href="startliste.xsl"?>\n\n'

  data = xml_Header
  data = data + '<startliste>\n'

  data = data + '<datum>%s</datum>\n' % datum

  sql_result = context.querie_flg_alle_fluege_zu_einem_datum(flg_date = context.format_datestring_to_sql_py(datum))

  index = 0
  for x in sql_result:
    data = data + '<flug>\n'
    data = data + '<Nr>' + str(sql_result[index][9]) + '</Nr>\n'
    data = data + '<Luftfahrzeugfuehrer>' + str(sql_result[index][10]) + '</Luftfahrzeugfuehrer>\n'
    data = data + '<Begleiter>' + str(sql_result[index][12]) + '</Begleiter>\n'
    data = data + '<Luftfahrzeugmuster>' + str(sql_result[index][15]) + '</Luftfahrzeugmuster>\n'
    data = data + '<Luftfahrzeugkennzeichen>' + str(sql_result[index][14]) + '</Luftfahrzeugkennzeichen>\n'
    data = data + '<Startart>' + str(sql_result[index][22]) + '</Startart>\n'

    if str(sql_result[index][18])[:5] != '00:00':
      data = data + '<Startzeit>' + str(sql_result[index][18])[:5] + '</Startzeit>\n'

    if str(sql_result[index][19])[:5] != '00:00':
      data = data + '<Landezeit>' + str(sql_result[index][19])[:5] + '</Landezeit>\n'
   
    if str(sql_result[index][20])[:5] != '00:00':
      data = data + '<Segelflugzeit>' + str(sql_result[index][20])[:5] + '</Segelflugzeit>\n'
   
    if str(sql_result[index][21])[:5] != '00:00':
      data = data + '<Motorflugzeit>' + str(sql_result[index][21])[:5] + '</Motorflugzeit>\n'
    data = data + '<Bemerkungen>' + str(sql_result[index][23]).replace('\n', '') + '</Bemerkungen>\n'
    data = data + '<Ausbildung>' + str(sql_result[index][24]) + '</Ausbildung>\n'
    data = data + '</flug>\n'
    index += 1

  data = data + '</startliste>\n'

  data = context.code_utf_to_iso(data)

  startlisten_ordner.manage_addFile(
      id,
      file = data,
      title = 'Startliste vom %s' % datum,
      content_type = "text/plain"
  )

return None


Mein Link nennt sich Druckansicht und soll erst die XML-Datei mit dem obigen Script erstellen lassen und anschließend direkt die Datei anzeigen (also auf sie verweisen). Mit dem Punkt "Ziel speichern unter..." bietet sich zugleich eine Downloadmöglichkeit an.
Das Problem ist momentan nur, dass der Seitenaufbau unnötig lange dauert. Die Seite wiederum enthält ein Formular, welches den Inhalt der XML-Datei sozusagen verändert, wonach sie beim Download stets neu geschrieben werden sollte.

Ich hoffe, dich mit dieser Beschreibung nicht zu getextet zu haben :-)

Grüße
JR
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Sonntag 6. August 2006, 19:15

JR hat geschrieben:leider ist es so, dass ich die XML-Datei auf jedem Fall auch anlegen möchte, da sie für eine Datenanzeige via XSL verwendet wird und der Anwender gleichzeitig die Möglichkeit haben soll, die Datei herunter zu laden.

Hi JR!

Ich hätte die Datei bereits erstellt, nachdem das Formular ausgefüllt und abgeschickt wurde. Aber das was du in deinem Fall wahrscheinlich brauchst, ist ein Redirect zur neu erstellten Datei.

Das funktioniert so:

Code: Alles auswählen

request = container.REQUEST
response = request.RESPONSE
...
...
response.redirect(startlisten_ordner[id].absolute_url())

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Beitragvon JR » Montag 7. August 2006, 07:37

Hey Gerold,

perfekt, das habe ich gesucht/ gebraucht ;-)

Merci und Grüße
JR

Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot]