Seite 1 von 2

Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Freitag 3. Februar 2017, 13:01
von Mars_ars
Hallo, ich arbeite gerade an einem Projekt für die Uni. Wir haben die Grundlagen von Python3 gelernt und müssen nun ein kleines Programm schreiben, welches eine fastq datei einliest und diese analysiert. Ich dachte mir, dass es interessant wäre ein html-basierendes Userinterface zu erstellen. So bin ich auf Bottle gestoßen. Ich möchte nun, dass der Benutzer eine Datei "hochlädt" (erstmal ohne einen richtigen Server) und diese von einem Pythonprogramm weiterverarbeitet wird. Leider scheitere ich an der Stelle mit der Weitergabe der Datei. Ich weiß nicht, wie ich auf die Datei zugreifen kann, denn diese erscheint nicht im Verzeichnis von dem "serverseitigen" Bottleprogramm. Dennoch meldet mir der Server, dass der upload erfolgreich war und bei einem erneuten Upload der gleichen Datei, dass diese bereits vorhanden ist (Diese Meldung ist etwas nervig, es gibt doch die Klasse UploadFile mit der Funktion save, die ein Überschreiben ermöglicht, wie kann ich diese einbinden?)

Folgendes habe ich mir durchgelesen, aber anscheinend übersehe ich etwas:
http://bottlepy.org/docs/dev/tutorial.html#file-uploads
http://bottlepy.org/docs/dev/api.html#b ... pload.file
http://stackoverflow.com/questions/1236 ... ith-bottle
http://stackoverflow.com/questions/1429 ... nd-process
und noch einige weitere Webseiten.

bottle_test.py:

Code: Alles auswählen

from bottle import route, run, template, static_file, request, response, url, default_app, get, post, FileUpload
import bottle
import os
# Aufrufen der Hauptseite
@route('/')
def index():
	return template('main_template')
	
# Einbinden unterschiedlicher Dateien z.B. Bilder oder CSS-Files
@route('/static/style/<filepath:re:.*\.css>')
def server_static(filepath):
	return static_file(filepath, root='static/style')

@route('/static/images/<filepath:re:.*\.(jpg|png|gif|ico|svg)>')
def img(filepath):
    return static_file(filepath, root="static/images")

@route('/static/sonstige-bilder/<filepath:re:.*\.(jpg|png|gif|ico|svg)>')
def img(filepath):
    return static_file(filepath, root='static/sonstige-bilder')
# Formularabfrage
@route('/repeat', method='POST')
def do_login():
    username = request.forms.get('username')
    password = request.forms.get('password')
    if username == 'arsenij' and password == '1234':
        return "<p>Your login information was correct.</p>"
    else:
        return "<p>Login failed.</p>"

@route('/upload', method='POST')
def do_upload():
	category = request.forms.get('category')
	upload = request.files.get('upload')
	name, ext = os.path.splitext(upload.filename)
	if ext not in ('.fastq'):
	    return 'File extension not allowed.'

	save_path = '/tmp/(category)'
	if not os.path.exists(save_path):
	    os.makedirs(save_path)

	file_path = "{path}/{file}".format(path=save_path, file=upload.filename)
	upload.save(file_path)
	return 'File uploaded'
	
if __name__ == '__main__':
    bottle.debug(True)
    bottle.run(host='0.0.0.0', port=8080,  reloader=True)
 
main_template.tpl

Code: Alles auswählen

...
<form action="/upload" method="post" enctype="multipart/form-data">
Category:      <input type="text" name="category" />
Select a file: <input type="file" name="upload" />
<input type="submit" value="Start upload" />
</form>
...

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Freitag 3. Februar 2017, 14:15
von Sirius3
@Mars_ars: wo vermutest Du, dass die Datei landet und wo schaust Du danach? Bei save kann man overwrite=True angeben, sodass keine nervige Meldunge mehr kommen sollte. Normalerweise hat man nur eine Route zu den statischen Dateien und nicht eine pro Dateityp.

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Freitag 3. Februar 2017, 14:46
von Mars_ars
also ich stelle mir das folgendermaßen vor:

fastqdatei irgendwo auf der Platte

Verzeichnis in dem Bottle liegt: (Dateien groß geschrieben)
.
|-BOTTLE.PY
|-BOTTLE_TEST.PY
|-__pycache__
|-views
| |-MAIN_TEMPLATE.TPL
|-static
| |-style
| | |-CSS_DATEIEN
| |-sonstige-bilder
| | |-BILD_DATEIEN
| |-images
| | |-BILD_DATEIEN
|-tmp
| |-UPLOADED_FILE.fastq

ich würde erwarten, dass

Code: Alles auswählen

save_path = '/tmp/(category)'
    if not os.path.exists(save_path):
        os.makedirs(save_path)

    file_path = "{path}/{file}".format(path=save_path, file=upload.filename)
    upload.save(file_path, overwrite=True)
ein neues Verzeichnis anlegt, indem die Datei liegt und ich mit einer nächsten Funktion in bottle_test.py ganz normal die datei öffnet und mit dem Inhalt weiterarbeitet.

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Freitag 3. Februar 2017, 15:02
von Mars_ars
Habe gerade die Datei bottle_test.py erweitert und eine neue Teplate_Datei erstellt. Ich weiß schon, dass für jede neue Antwort oder Änderung der Seite nicht unbedingt eine neue Template-Datei erstellt werden muss. Man könnte das Modular viel hübscher lösen. Aber übersichtshalber und zu Lernzwecken wird es reichen. :wink:

Jetzt wird der Benutzer nach dem Upload auf die neue Template weitergeleitet, wo ein weiterer Butten ist, der nun die Verarbeitung der Datei ermöglichen sollte. Nur leider meldet er mir, dass das Verzeichnis nicht existiert:

bottle_test.py:

Code: Alles auswählen

@route('/upload', method='POST')
def do_upload():
    category = request.forms.get('category')
    upload = request.files.get('upload')
    name, ext = os.path.splitext(upload.filename)
    if ext not in ('.fastq'):
        return 'File extension not allowed.'

    save_path = '/tmp/(category)'
    if not os.path.exists(save_path):
        os.makedirs(save_path)

    file_path = "{path}/{file}".format(path=save_path, file=upload.filename)
    upload.save(file_path, overwrite=True)
    return template('upload')

@route('/analyse', method='POST')
def analyse():
    proceed = request.forms.get('analyse')
    fileobj = open('upload.filename', 'r')
    for line in fileobj:
        print(line)

Code: Alles auswählen

...
<p>File successful uploaded</p>
	<p>want you see your file with the coding was used?</p>
	<p><form action="/analyse" method="post">
 	<p><input value="rec_analyse" type="submit" name="analyse" /></p>
</form>
...

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Freitag 3. Februar 2017, 15:04
von Mars_ars
Übrigens vielen Dank für die Antwort!

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Freitag 3. Februar 2017, 15:29
von Sirius3
@Mars_ars: versuch mal genau nachzuvollziehen, wohin die Datei mit welchem Namen geschrieben wird, und welche Datei Du bei analyse versuchst zu öffnen.

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Freitag 3. Februar 2017, 16:33
von Mars_ars
Hm...
Also unter dem Verzeichnis /tmp/ wird ein neuer Ordner erstellt mit dem benutzerdefinierten Namen (category)
der richtige Name der Datei wird in der Variable upload gespeichert
der Befehl die Datei zu speichern beinhaltet die Variable file_path, die so aussieht: /tmp/(category)/upload.filename
ich muss noch die Variablen in die neue Funktion importieren und er zeigt mir wieder eine Fehlermeldung. Außerdem müsste man doch die Verzeichnisse sehen können.

Code: Alles auswählen

@route('/analyse', method='POST')
def analyse():
    upload = do_upload(upload)
    file_path = do_upload(file_path)
    proceed = request.forms.get('analyse')
    fileobj = open(file_path, 'r')
    for line in fileobj:
        print(line)
Leicht modifiziert aber immer noch nicht richtig.
Bin ich mit meinen Überlegungen auf dem Holzweg? Wo ist der Denkfehler?

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Freitag 3. Februar 2017, 17:45
von Mars_ars
Wenn ich in der Funktion /upload bei return mehrere Variablen übergebe, kommt die folgende Fehlermeldung:

Code: Alles auswählen

return template('upload'), file_path, upload
Critical error while processing request: /upload
Error:

TypeError('sequence item 2: expected str instance, FileUpload found',)

Traceback:

Traceback (most recent call last):
File "/home/arsenij/Dokumente/Final_project/test/bottle.py", line 954, in wsgi
out = self._cast(self._handle(environ))
File "/home/arsenij/Dokumente/Final_project/test/bottle.py", line 894, in _cast
out = out[0][0:0].join(out) # b'abc'[0:0] -> b''
TypeError: sequence item 2: expected str instance, FileUpload found
Darf ich dann nicht mehrere Variablen übergeben oder mache ich nur etwas grundlegend falsch.

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Freitag 3. Februar 2017, 18:39
von BlackJack
@Mars_ars: Der Rückgabwert muss eine Sequenz von Zeichenketten sein wenn man eine Sequenz zurück gibt. Und das dritte Element ist vom Typ `FileUpload` und nicht vom Typ `str`.

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Freitag 3. Februar 2017, 19:47
von Sirius3
@Mars_ars: hast Du jetzt in das Verzeichnis auf /tmp/ geschaut und dort die Dateien gefunden? Woher glaubst Du kommt in Deiner neuen analyse-Funktion upload und file_path? Und was glaubst Du macht damit ein do_upload? Wenn Du file_path in der analyse-Methode haben willst, mußt Du in do_upload file_path in Dein Template als <input>-Parameter einbauen, was aber an sich eine schlechte Idee ist, weil jeder der einen Analyse-Request absetzt, damit beliebige Dateien angeben könnte. Sinnvoller wäre es, einen zufälligen Schlüssel zu erzeugen und die hochgeladene Datei damit zu benennen. Die Gefahr, dass damit Unheil anrichten kann, ist viel geringer.

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Samstag 4. Februar 2017, 18:50
von Mars_ars
@Sirius3 Vielen herzlichen Dank für deine Antworten und die Unterstützung. Ich habe endlich das Verzeichnis gefunden. Erwartet habe ich es ja in dem Verzeichnis von bottle_test.py aber so macht es natürlich auch Sinn :D
Die Sicherheitsfrage ist mir nicht ganz deutlich geworden, da ja der Upload und die Analyse unabhängig voneinander sind. Ich habe nun ein paar kleine Verbesserungen eingefügt: Entfernen des Inputs für die Kategorie/Verzeichnis; Generieren eines zufälligen Schlüssels und umbenennen der upload.filename. Leider scheitere ich an der Variablenübergabe von der Funktion

Code: Alles auswählen

do_upload
zu

Code: Alles auswählen

analyse
. Ich bin mir auch nicht sicher, ob dein Sicherheitshinweis dadurch erfüllt wurde.

Code: Alles auswählen

@route('/upload', method='POST')
def do_upload():
    new_key=''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(8))
    upload = request.files.get('upload')
    name, ext = os.path.splitext(upload.filename)
    if ext not in ('.fastq'):
        return 'File extension not allowed.'

    save_path = '/tmp/fastq_prog'
    if not os.path.exists(save_path):
        os.makedirs(save_path)

    file_path = "{path}/{file}".format(path=save_path, file=upload.filename)
    upload.save(file_path, overwrite=True)

    new_name = '/tmp/fastq_prog/'+new_key
    old_name = '/tmp/fastq_prog/'+upload.filename
    os.rename(old_name, new_name)

    return template('upload'), new_key

@route('/analyse', method='POST')
def analyse():
    new_key1 = do_upload(new_key)

    filename = open('/tmp/fastq_prog/'+new_key)
    for line in filename:
        print(line)

Code: Alles auswählen

<p>File successful uploaded</p>
			<p>want to see your file with the coding was used?</p>
			<p><form action="/analyse" method="post" enctype="multipart/form-data">
            <p><input value="rec_analyse" type="submit" name="analyse" /></p>
			</form>
So geht es leider auch nicht: :K

Code: Alles auswählen

@route('/upload', method='POST')
def do_upload():
    new_key=''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(8))
    upload = request.files.get('upload')
    name, ext = os.path.splitext(upload.filename)
    if ext not in ('.fastq'):
        return 'File extension not allowed.'

    save_path = '/tmp/fastq_prog'
    if not os.path.exists(save_path):
        os.makedirs(save_path)

    file_path = "{path}/{file}".format(path=save_path, file=upload.filename)
    upload.save(file_path, overwrite=True)

    new_name = '/tmp/fastq_prog/'+new_key
    old_name = '/tmp/fastq_prog/'+upload.filename
    os.rename(old_name, new_name)

    return template('upload')

@route('/analyse', method='POST')
def analyse():
    new_key = request.files.get('new_key')

    filename = open('/tmp/fastq_prog/'+new_key)
    for line in filename:
        print(line)

Code: Alles auswählen

<p>File successful uploaded</p>
			<p>want to see your file with the coding was used?</p>
			<p><form action="/analyse" method="post" enctype="multipart/form-data">
            <p><input value={{new_key}} type="submit" name="analyse" /></p>
			</form>

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Samstag 4. Februar 2017, 19:36
von Sirius3
@Mars_ars: genau, do_upload ist unabhängig von analyse. Bei Funktionen werden vom Nutzer über einen Web-Browser angestoßen. Der einzige Weg, Informationen zu übertragen, ist über das Template mit hidden-<input>-Tags. Dein erster Versuch ist in der Hinsicht noch weit von der Lösung entfernt, der zweite schon fast richtig, nur dass es eben keine files in analyse gibt, sondern nur normale POST-Argumente. Pfade setzt man weder mit .format noch mit + zusammen, sondern mit os.path.join.

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Samstag 4. Februar 2017, 21:55
von Mars_ars
Nach ewig langer Suche nach dem Fehler bin ich an der sensiblen Grenze der Verzweiflung angekommen :oops: :

Code: Alles auswählen

@route('/upload', method='POST')
def do_upload():
    new_key=''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(8))
    upload = request.files.get('upload')
    name, ext = os.path.splitext(upload.filename)
    if ext not in ('.fastq'):
        return 'File extension not allowed.'

    save_path = '/tmp/fastq_prog'
    if not os.path.exists(save_path):
        os.makedirs(save_path)

    file_path = "{path}/{file}".format(path=save_path, file=upload.filename)
    upload.save(file_path, overwrite=True)

    new_name = '/tmp/fastq_prog/'+new_key
    old_name = '/tmp/fastq_prog/'+upload.filename
    os.rename(old_name, new_name)

    return template('upload', new_key='new_key')

@route('/analyse', method='POST')
def analyse():
    new_key = request.forms.get('new_key')

    filename = open(os.path.join('/tmp/fastq_prog/',new_key), 'r')
    for line in filename:
        print(line)

Code: Alles auswählen

<p>File successful uploaded</p>
			<p>want to see your file with the coding was used?</p>
			<p>{{new_key}}</p> <--nur zum Überprüfen, ob die Variable ans Template übergeben wurde.
			<p><form action="/analyse" method="post" enctype="multipart/form-data">
			<input type='hidden' name='Key' value='{{new_key}}'/>
      <p><input value='Analyse' type="submit" name='analyse' /></p>
			</form>

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/arsenij/Dokumente/Final_project/test/bottle.py", line 862, in _handle
    return route.call(**args)
  File "/home/arsenij/Dokumente/Final_project/test/bottle.py", line 1740, in wrapper
    rv = callback(*a, **ka)
  File "bottle_test.py", line 57, in analyse
    filename = open(os.path.join('/tmp/fastq_prog/',new_key), 'r')
  File "/usr/lib/python3.5/posixpath.py", line 89, in join
    genericpath._check_arg_types('join', a, *p)
  File "/usr/lib/python3.5/genericpath.py", line 143, in _check_arg_types
    (funcname, s.__class__.__name__)) from None
TypeError: join() argument must be str or bytes, not 'NoneType'
Noch eine Frage zu bottle. In einigen Foreneinträgen habe ich etwas vom rendern der Templates gelesen. WIe ist das zu verstehen. Wird es mich auch betreffen?

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Samstag 4. Februar 2017, 22:59
von BlackJack
@Mars_ars: ``if ext not in ('.fastq'):`` macht nicht was Du denkst was es macht:

Code: Alles auswählen

In [4]: ext = '.'

In [5]: ext not in ('.fastq')
Out[5]: False
Ich verstehe auch dieses Umbenennen nicht wirklich. Statt unter einem Namen a zu speichern und dann von a nach b umzubenennen, wäre es weniger umständlich einfach gleich unter dem Namen b zu speichern.

Und warum gibtst Du den statischen Wert 'new_key' im Template zurück? Das macht keinen Sinn. Möchtest Du an der Stelle nicht vielleicht doch lieber den Wert der an den Namen `new_key` gebunden ist an das Template übergeben?

Anstelle des selbstgebastelten `new_key` würde ich mir eine passende UUID erstellen lassen.

In `analyse()` versuchst Du auf ein Formularfeld 'new_key' zuzugreifen, was es sehr offensichtlich nicht gibt. Also entweder nimmst Du denn tatsächlichen Namen des Feldes aus dem Formular oder passt den Namen dort an.

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Samstag 4. Februar 2017, 23:03
von Sirius3
@Mars_ars: Dein Problem ist, dass Du inzwischen zwar vieles richtig machst, aber nicht konzentriert genug bist. Wie sieht die analyse-Form genau aus? Dein „Überprüfen“ scheint auch nicht geholfen zu haben.

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Sonntag 5. Februar 2017, 12:14
von Mars_ars
Vielen Dank euch beiden für die Antworten. Ja Sirius3, du hattest recht. Mit einem frischen Blick auf die Dinge habe ich es doch geschafft. Auch habe ich die Anmerkungen von BlackJack berücksichtigt, danke dafür nochmal.
"If ext not in" damit Überprüfe ich zumindest vom Dateinamen das Format der Datei und lasse nicht zu, dass außer fastq-Dateien Dateien hochgeladen werden. Stimmt das nicht?
Den selbstgebastelten new_key behalte ich fürs erste (kann man ja später noch rel. einfach abändern).
Ich habe es sogar schon geschafft eine beispielhafte Plotgrafik einzubinden. Somit stehen mir hoffentlich keine allzu großen Hürden im Weg. :D Ich werde mich nun der Ausarbeitung des eigentlichen Inhalts zuwenden.
Ich muss es einfach nochmal loswerden: Dieses Forum ist absolut spitze und die Helfer einfach fantastisch. Ich fand die schrittweise Heranführung an die Lösung sehr amüsant und vor allem äußerst hilfreich. An dieser Stelle ein großes Lob und Dankeschön für eure Geduld.

P.S.
Sirius3 hat geschrieben: Normalerweise hat man nur eine Route zu den statischen Dateien und nicht eine pro Dateityp.
Anders habe ich es leider nicht hinbekommen. Ich war schon glücklich, dass es so funktioniert hat ^^ .

Hier nochmal der verbesserte Code:

Code: Alles auswählen

@route('/upload', method='POST')
def do_upload():
    new_key=''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(8))
    upload = request.files.get('upload')
    name, ext = os.path.splitext(upload.filename)
    if ext not in ('.fastq'):
        return 'File extension not allowed.'

    save_path = '/tmp/fastq_prog'
    if not os.path.exists(save_path):
        os.makedirs(save_path)

    file_path = "{path}/{file}".format(path=save_path, file=new_key)
    upload.save(file_path, overwrite=True)

    return template('upload', new_key=new_key)

@route('/analyse', method='POST')
def analyse():
    key = request.forms.get('new_key')

    filename = open(os.path.join('/tmp/fastq_prog/',key), 'r')
    count = 0
    for rec in SeqIO.parse(filename, 'fastq'):
        count += 1
#plot 1
    plt.ioff() # turn of interactive plotting mode
    x = [1,2,3]
    y = [5,7,4]

    x2 = [1,2,3]
    y2 = [14,10,12]

    plt.plot(x,y, label='first Line')
    plt.plot(x2,y2, label='second Line')
    plt.xlabel('Plot Number')
    plt.ylabel('Important var')
    plt.legend()

    plt.title('Interesting Graph\nSubtitle')


    plt.savefig('static/sonstige-bilder/plot1.png', bbox_inches='tight')


    return template('result1', count=count)

Code: Alles auswählen

<form action="/analyse" method="post" enctype="multipart/form-data">
			<input type='hidden' name='new_key' value='{{new_key}}'/>
      <p><input value='Analyse' type="submit" name='analyse' /></p>
			</form>

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Sonntag 5. Februar 2017, 13:31
von Sirius3
@Mars_ars: Du hast das mit der Static Route nicht einfach hinbekommen und hast es deshalb kompliziert gemacht? Blind irgendwelche „Lösungen“ von StackOverflow abzuschreiben ist so, wie wenn man Geschäftsbriefe von Google-Translate übersetzen läßt. »ext not in ".fastq"« läßt Dateien ohne Endung und mit den Endungen ., .f, .fa, .fas, .fast, und .fastq zu. Wenn ein Fehler auftritt, solltest Du »abort« benutzen und nicht einfach nur einen String zurückschicken. Auch in upload solltest Du os.path.join benutzen. Konstanten, wie hier '/tmp/fastq_prog' sollten nicht mehrmals im Programm auftauchen. Dateiobjekte sollten nicht filename heißen und auch wieder geschlossen werden, am einfachsten mit Hilfe des with-Statements. Nutzereingaben sollte man nicht blind übernehmen, vor allem nicht, wenn man damit Systemfunktionen aufruft. Dynamische Daten sollten nicht nach /static geschrieben werden.

Code: Alles auswählen

import os
import uuid
from bottle import route, template, static_file, request

STATIC_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static')
UPLOAD_PATH = '/tmp/fastq_prog'

@route('/')
def index():
    return template('main_template')

@route('/static/<filepath:path>')
def server_static(filepath):
    return static_file(filepath, root=STATIC_ROOT)

@route('/analyse/<filepath:path>')
def server_analyse(filepath):
    return static_file(filepath, root=UPLOAD_PATH)

@route('/upload', method='POST')
def do_upload():
    new_key = str(uuid.uuid1())
    upload = request.files.get('upload')
    name, ext = os.path.splitext(upload.filename)
    if ext != '.fastq':
        abort(400, 'File extension not allowed.')

    if not os.path.exists(UPLOAD_PATH):
        os.makedirs(UPLOAD_PATH)

    filename = os.path.join(UPLOAD_PATH, new_key + '.fastq')
    upload.save(file_path, overwrite=True)
    return template('upload', new_key=new_key)

@route('/analyse', method='POST')
def analyse():
    key = request.forms.get('new_key')
    try:
        # check for valid ID
        uuid.UUID(key)
    except ValueError:
        abort(400, 'Invalid key.')
    filename = os.path.join(UPLOAD_PATH, key) + '.fastq'
    with open(filename):
        count = 0
        for rec in SeqIO.parse(filename, 'fastq'):
            count += 1

    os.mkdir(os.path.join(UPLOAD_PATH, key))

    x = [1,2,3]
    y = [5,7,4]
    x2 = [1,2,3]
    y2 = [14,10,12]
    plt.plot(x,y, label='first Line')
    plt.plot(x2,y2, label='second Line')
    plt.xlabel('Plot Number')
    plt.ylabel('Important var')
    plt.legend()
    plt.title('Interesting Graph\nSubtitle')

    imagefilename = os.path.join(UPLOAD_PATH, key, 'plot1.png')
    plt.savefig(imagefilename, bbox_inches='tight')
    return template('result', count=count, image='/analyse/{}/plot1.png'.format(key))

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Montag 6. Februar 2017, 19:01
von Mars_ars
@Sirius3 Vielen herzlichen Dank! Das hatte ich nun wirklich nicht erwartet. :D Es ist fantastisch von einem Profi zu lernen. Ich werde versuchen deine Kritikpunkte auch weiterhin zu beachten.
Herzliche Grüße
Mars_ars

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Dienstag 7. Februar 2017, 16:38
von Mars_ars
@Sirius3 ich habe leider damit ein Problem aus deinem Code:

Code: Alles auswählen

try:
# check for valid ID
	uuid.UUID(key)
except ValueError:
	abort(400, 'Invalid key.')
Einerseits kommt ein ValueError, weil 'abort' nicht definiert ist (Das allererste abort habe ich durch return ersetzt und ein Fehlertemplate erstellt.). Andererseits, wenn ich 'abort' durch 'return 'Invalid key' ersetze, bekomme ich immer diesen Fehler. Anscheinend klappt die Überprüfung nicht. Ich konnte auch nichts passendes dazu finden außer https://docs.python.org/3.5/library/uuid.html. Hast du einen Tipp für mich?
Gruß
Mars_ars

Re: Verarbeiten einer Datei mit Python3 und Bottle

Verfasst: Dienstag 7. Februar 2017, 17:04
von Sirius3
@Mars_ars: beim Aufräumen der Importe ist das abort verloren gegangen:

Code: Alles auswählen

from bottle import route, template, static_file, request, abort