09. Jupyter Notebook

ehemalige Veranstaltungen ia3.netz + ia3.data sowie ia4.Netz im Studiengang Interaktive Medien

(c) 2020 Hochschule Augsburg - Fakultät für Informatik - Prof.Dr.Nik Klever

In [4]:
%%writefile "Aufgabe 8/flask_aufgabe_8.py"
from flask import Flask, render_template, send_file
from os import listdir, path

app = Flask(__name__)
app.debug = True
app.env = "development"

app.path = "./"

@app.route("/",defaults={"path_dir":""})
@app.route("/<path:path_dir>")
def show_dir(path_dir):
    app.path = path.join(app.path,path_dir)
    if path.isfile(app.path):
        return send_file(app.path)
    else:
        files = listdir(app.path)
        return render_template("files.html",files=files)

if __name__ == "__main__":
    app.run()
Overwriting Aufgabe 8/flask_aufgabe_8.py
In [3]:
%%writefile "Aufgabe 8/templates/files.html"
<html>
<head>
</head>
<body>
    <ul>
        {% for file in files %}
            <li><a href="{{ file }}">{{ file }}</a></li>
        {% endfor %}
    </ul>
</body>
</html>
Writing Aufgabe 8/templates/files.html
In [6]:
%%writefile "Aufgabe 8/flask_aufgabe_8a.py"
from flask import Flask, render_template, send_file, redirect, url_for
from os import listdir, path

app = Flask(__name__)
app.debug = True
app.env = "development"

app.path = "./"

@app.route("/",defaults={"path_dir":""})
@app.route("/<path:path_dir>")
def show_dir(path_dir):
    app.path = path.join(app.path,path_dir)
    if path.isfile(app.path):
        return send_file(app.path)
    else:
        files = listdir(app.path)
        for file in files:
            if file == "index.html":
                return send_file(path.join(app.path,"index.html"))
        return render_template("files.html",files=files)

@app.route("/user/<user>")
def userpage(user):
    app.path = path.join("./",user,"WWW")
    return redirect(url_for("show_dir",path_dir=""))

if __name__ == "__main__":
    app.run()
Overwriting Aufgabe 8/flask_aufgabe_8a.py
In [21]:
%%writefile "Aufgabe 8/flask_aufgabe_8b.py"
from flask import Flask, render_template, send_file, redirect, url_for, abort
from os import listdir, path

app = Flask(__name__)
app.debug = True
app.env = "development"

@app.route("/",defaults={"path_dir":"","user":""})
@app.route("/homes/<user>/",defaults={"path_dir":""})
@app.route("/homes/<user>/<path:path_dir>")
def show_dir(user,path_dir=""):
    print("show_dir:",user,path_dir)
    if user:
        app.path = path.join(".",user,"WWW")
        print(app.path)
        if path.exists(app.path):
            app.path = path.join(app.path,path_dir)
            print(app.path)
            if path.isfile(app.path):
                return send_file(app.path)
            elif path.isdir(app.path):
                files = listdir(app.path)
                if files:
                    if "index.html" in files:
                        return send_file(path.join(app.path,"index.html"))
                    else:
                        return render_template("filesCss.html",files=files,dirName=path_dir)
                else:
                    return abort(403)
            else:
                return abort(404)
        else:
            return abort(403)
    else:
        return render_template("hsa_index.html")

if __name__ == "__main__":
    app.run()
Overwriting Aufgabe 8/flask_aufgabe_8b.py
In [20]:
%%writefile "Aufgabe 8/templates/filesCss.html"
<html>
<head>
  <title>CSV Datei</title>
  <style type="text/css">
.even { background-color:#ffffff; }
.odd { background-color:#e0e0e0; }
  </style>
</head>
<body>
  <h1>Directory "{{ dirName }}"</h1>
    <ul>
{% for file in files %}
      {% if not file.startswith(".") %}
          <li class =  "{{loop.cycle('odd','even')}}"> <a href="{{ dirName }}/{{ file }}">{{ file }}</a> </li>
      {% endif %}
{% endfor %}
    </ul>
</body>
</html>
Overwriting Aufgabe 8/templates/filesCss.html
In [28]:
%%writefile "Aufgabe 8/flask_aufgabe_8c.py"
from flask import Flask, render_template, send_file, redirect, \
                    url_for, abort, make_response
from os import listdir, path

app = Flask(__name__)
app.debug = True
app.env = "development"

def leseDatei(dateiname):
    try:
        datei = open(dateiname,"rb")
        gesamterText = datei.read()
        datei.close()
        return gesamterText
    except IOError:
        return "Die Datei {} wurde nicht gefunden".format(dateiname)

@app.route("/",defaults={"path_dir":"","user":""})
@app.route("/homes/<user>/",defaults={"path_dir":""})
@app.route("/homes/<user>/<path:path_dir>")
def show_dir(user,path_dir=""):
    print("show_dir:",user,path_dir)
    if user:
        app.path = path.join(".",user,"WWW")
        print(app.path)
        if path.exists(app.path):
            app.path = path.join(app.path,path_dir)
            print(app.path)
            if path.isfile(app.path):
                if app.path.endswith(".png"):
                    resp = make_response(leseDatei(app.path), 200)
                    resp.headers["Content-type"] = "image/png"
                    return resp
                else:
                    return leseDatei(app.path)
            elif path.isdir(app.path):
                files = listdir(app.path)
                if files:
                    if "index.html" in files:
                        return leseDatei(path.join(app.path,"index.html"))
                    else:
                        return render_template("filesCss.html",files=files,dirName=path_dir)
                else:
                    return abort(403)
            else:
                return abort(404)
        else:
            return abort(403)
    else:
        return render_template("hsa_index.html")

if __name__ == "__main__":
    app.run()
Overwriting Aufgabe 8/flask_aufgabe_8c.py
In [24]:
with open("Aufgabe 8/fritz/WWW/logo.png","rb") as f:
    content = f.read()
In [25]:
content
Out[25]:
b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xd0\x00\x00\x008\x08\x06\x00\x00\x00\x8c\xb3v\x9b\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x16\xdcIDATx\x01\xed\x9d\x0bxTE\x96\x80\xef\xedN Iw\x14\x94\xa7\xba\x02\xa2\xbcA\x85\xf1\x81\xe2(\xa3\xa3\x8c\xc3\x10EaDaa\xbf\xf8\xfe\x06W]\xd7$<$#0\t#8\x08\xee\x80\xc2HD\x01\x17Q\xd4qp\x9c\x9d]a@Qf\x00Q\x11"\xa0\xbc\xc5!\x82\x907I\xfa\xee\x7f\xda\xbe7uo\xba;\x1d\xd2!\xc1\xdc\xfa\xbe\x9b\xaa:u\xea\xd4\xa9s\xebT\x9d:U}\xa3kM(dgg\'\x95\x96\x96\xa6k\x9a\xde_\xd3\x8c]\xba\xae\xcf\xcb\xcd\xcd=\xda\x84XtYq%`\x93\x80n\xcb5bf\xce\x9c9-\x0f\x1c8\xb0\xda0\xb4+\x156\x0e\xa6\xa4$\x0f@\xb1\x0e)07\xe9J\xa0\xc9H\xc0\xd3T89x\xf0\xe0X\x87\xf2\x08k\xe7\xb0"e7\x15\x1e]>\\\t8%\xd0d\x14(\x10\xd0.u2\xf7}^\xffQx\xb8\x0bu%\xd0\xf8\x12h\x10\x052\x9e\xea\xe73\x9e\x1e\x98\\\x97\xeey<\xda\xee\xf0\xf8\xc6\x9e\xf0p\x17\xeaJ\xa0\xf1%\x90 ,\xb0\xc7\xf0\x1f=~\xfc\xe7\xba\xc7\xf3\xcd\xec\x993W\xc7\xca\x96\x91\xd9\xb7u\x89~\xe2\x1aL\xafA<W\xeb\x9aq\xbe\xa6km\x8a\n\xca\x924\xadL+\xca\xec^\xa2\x19Z\x81\xa1\x1b\xbb\xd9l\xbd\xaf{\xb4\xb5)g\xea\xeb\xf4\x8c\xfcBg\x1b8\x0c^\xc0q\xf0\x10\xf0s\xcc2`\'\x0c\xc3;\xc3\xcc\xbb\xb1+\x81\xa6&\x01\xfd\xb1\xc7\x1ekWQY\xb9\x19\xc6\x82\x03\x97\x81>\x9b\xf0H4FK\xb3z\\[e\x18\x0f\xa0\x1c\xc3\r\xcdH\x8c\x86\xeb,\x83~)J\xf6\xdf\x1eo\xe2\xbc\x94\xe9[7\xa8\xe5\x13\'N\xecTQQ5U\xd7\xb5\x01(\xd3W\x1e\x8fgzNN\xcez\x15\xc7M\xbb\x12hJ\x12\xd0\x1fy\xe4\x91\t\x01\xc3\x98\xae0U\x91\x9c\x94\xd4>\x9c\xfb\xb84\xab\xd75UF\xe5\\V\x9b\x8b\x15\xfc\x93O\xea\xfaz\x8f\xa6\x8f\xf7\xe5n\xdfx\xf2D\xdc\x9a\xa7\xa3\x04F\x8c\x18\xd1e\xf9\xf2\xe5\xbb\xb12\x8c\xd3\x91\x7f\x93g1\xe1\xca\xcdL(N\xa8\xa8\xa8\xf0\xaa\xb0\xc2\xec~\xed\xf4\xb2\xf2\x99\x95\x81\xca1*\xbc\xdei\xc3\x18\x88y\xb7\xa10\xb3\xfb|\x7fR\xf2D=\xfb\xe3\xef\xeaM\xd3%\xd0$%\xc06!a\xf3\xe6\xcd\xbf0\x0c\xe3\xa70\xf8\xd3\xf2\xf2\xf2\x0b\xef\xbb\xef\xbe\x16\xa4+\x9a$\xc312\xe5IJJ\xcac\x16\xf8\xc2\xc2\xd7\xf5\xd9\xb3f\xcd*0\xf3\xc5\x99\xbd.\xd5\xcb\xca6\xd1\xf1\xf8*O\xa8\x01V3\x8ff\x18\x0f\x16\x95\x96n(\xcb\xea\xd1\xcdl\xd7\x8d\x7fX\x12\xf8\xe4\x93O\xda2\x86^\xa7W\x0f\xf0\\\xf8C\xe9\x9d\x87=\xc6\xb7\t^o\x7f\xcd\xeb\x1d\xa2\'$\\\xf5\xcc\xef~\xf7\xa8\xd9\xb9\x92\xcc\x9e\xb7\x1aZ\xd5:\x06\xf9\xb9&\xac\xe1b\xe3\xa2\n\xc3\xf8\xb0hB\xb7\xeb\x1b\xae\r\x97\xb2+\x81\xf8J \xe8\x85\x9b9sf1d\xdfUI\x17gu\xbb%`T\xad\x08\xae\x10j\x81#\xadk\xfa!\x8c\xd8\x9d\x98\xb2\xbb4\xc3\xf3-&Y1N\x80"\x1c\x0cb\xdc\xfa(\xf7\xe3\x10hC\xfaB\xdd0\xba\x12\xb7s\x90\xa8\xce\x1aFk-\xa0\xaf*\xcc\xecqSj\xee\xf6\xd5\xd5\x05n\xca\x95@\xd3\x94@P\x81\x9c\xac\x95d\xf5\xba"\x10\xa8\\\xca`\xafqN\x84rl\xd1\x0c\xfd]\x14c]J\xb2\xf7}={\xeb\x11g\xfdhy#\xeb\xd2\xb6\xa5F\xd9 \x1c\x17\x83\x0c=0\x04E\xeb\xa5\xe2\xb3\xccc\x17\x1b+\xcb\'\xf5\xb9\xaa\xe5\xb4\xcf\xb6\xa9en\xda\x95@S\x93\x00^e{(\xce\xee~N\xa0\xcc\xf8\x98\x81\xdd\xd6,Ai\x0e\x80\xb8\xc0\x9b\xa0\xbf\x924-?\xdf\x84\xc7#.\x9c\xd0\xb3\x8ffT\x8d\xd2\x03\xda\xdd\xea\xea\xc4\xbel\x8f\xcf\xf0_\xac\xcf\xd8x,\x1e\xed\xfcPi0\xe1\xe8\xa3G\x8fN]\xb2d\xc9\xf1\xa6\xdc\xc7\xe1\xc3\x87w\xac\xac\xac<\xa8\xf2\xd8\xa1C\x87\x16\xcf?\xff|\xdc\x9c\x08\xe2\xa8\xe0\xa9T\xdbh\x88\xb4\xc8\xdc\xf4\x1e\xd6P\xa0\xc2\x8cn\xaf\xd1\xe8\xf0`\xc38\x17Xir|]|K\xf4\xfb6\xc6\xad\xa3\xe1:ed_\x97TR~h,\xcce\xf2t\xfe\x1eG\x7f.uF\xfe\xfd\xe1\xf0\xeb\x0b\xbb\xe5\x96[\x1e\x87\x86\xe5m\xe4\xcc\xe9\xa5\xd7_\x7f}\x7f8\xba"0\xf0\xa7\xaae\xc0~\xff\xd6[o\xd9\x06\x84Z\xae\xa6\xd3\xd2\xd2\xee\x04\xff"\x13F[k\xdex\xe3\x8d\xd5f\xde\x19\x83\xff \xb0\xce&\x1c\xdc\x0c\xf3\x85\t\x8c\xc1xuUUU:\xc9\x1bx:@[\xce\xe2\xca\xc1\xf9\x92\xf8M\xf2y\xf0\x16u\xa2\x1b6l\xd8\x08p\xbb\xf3\x04\x03<}G;\xcf\x9a\xf9Xb\xf8\xbc\x89\xb6.3qi\xff\xe8\x9bo\xbe\xf9_f\x1e\x99\x8d\n\x04\x02=%O\x99\x1f\\\xdb\xf9"\xb0\xe9\xc0\x02&\xbe\x19\xa3XScQ,\xda\xefK\x9d;\xa01\x84\xf8|\x9e6\xd0\x94C\xfa}<\x9b\xe9\xd3\x0b\xbc\xd3\xf7\x8017\xd7\x1e\x90\xc9=\xd4\t\xee\xf7\xe1\xfb82|\xda\xacE\x99\x9c\x93N\x82\xd6\xb5\xb4\xd7\x8d\xf8\xef\xf4\xf5*\x9b\tW\x9c\xd1=-\xa0\x19\xc3Q\x9ab\x0e;\xa7\xfa\xba\xf8\x9fnh\xc51\x19\xd4\xb3W\x97\x91~\x0eEz\xb1\xa8\xfcP\x96\x1e\x08d`\xca\xdd[\x9a\xd1\xed\xe5\xe4\x19_\xac3\xf1\xe2\x15#\x84\xa9<\x98\x8b\xdf\x07\xd2\xd2\xc6~3\xaf\xc6#G\x8e\xf4P>Q\x85!\xe8\x95\xe4cR \xf0\xee\xe2\xb9\xd9\xac\x0f\xad\'I\xaf6\xf3a\xe2\xdb\xc1\x19l\xc2i_\xf0\x8bF\x8d\x1a\xd5\xbe\xa4\xa4\xe4ef\xf2\x1b\xcc2%nI\x1d\x19\xac\xf2<\xc6\xe0\x9au\xfe\xf9\xe7O\x99;w\xae\xf3\x98\xc2\xac\xd2\x8a\x845)0`4\xcef\xfe\xfc\xea\xab\xaf\xee4\x11b\x88\x9f\x02G\x06q0\xd0\xfe<3-14\x7fI\x94&i\xca$\xb2\x05`6\x99\x9a\x85\\ \x9eA\xba\xc2\xcc;c\xf8\xecp\xe2\xc4\x89\xd9\xd4\x17\xfa\xb6\x00,\x15\x80l\x0bz1\xc9\xdc\x85\x1c\xfe~\xdbm\xb7\xdd\xf1\xdak\xaf\xc9\xe4\x125\xa0\x14c\xe0\xf9\x9a\x10\xd2a\xe2\xa0\x02\xa1<\xf2\xfe\x9e\xe3\xf1)\xfd\x90v\xaa\xf78\xc6\xf2\x11^C\xd7fc\xaem\xf6&j}\xfd\xb9\xf93N\x95\xf2\x08#f\x10EJ\xcd\xd9>%\xd1\x93\xd8\x1f?\xc4\x17U\x9a\xfe\x8cY\xd6\x8c\xe2RG_\xfd\xbc\xc4K\x8b\x8b\x8b?\xe6\x05\x86S\x1e\x07\xba\x96\x00^\xc6\xde\xbd{\xdff\xb0%;\x0bC\xf9W\x88\x8b\xd52\x06e\xccG\x15\xf0\xd3\x9d6,\xe5\x11:L*y*\xbd\x86H\x8b\x1c\xe0\xf33\xda\xae\xa1<\x11\xda\xbb\x8c\tg\x13\xab\xe1\xe5\x11\xca-04-y\xa0L\\GC\xfb\xd3\xd2~A\x94\xc7\xe3\xe3\xa9\x11,\'A\xe9\xa6Ooa\x9eX\xefK:\xe7\xaa\xe4i\xf9_\xd5\xc0<\xc5\x80\x969[?\xf7\x9f\xa5a\x1e\x18_\xcb\xd5\xa1S\xdc|c7gS \x06L\'^\xa8\xacx\x1d\x841\xd2\'xV\x91\x94\x15\xe4\x01\xd2\xbf!\xfe\x84\xc7\x16\x18\x107p`\xb9\xcc\x06\x0ce0O\xc4\xd4\x11%\xb2\x02\xf8\xa3\xadL-\t\x94e\xa4\x8a\x02\x0f\xdb0\x0178`[\x81\xffM\x1e\xe0\x1f\xaae\x92\x06\xbe\xd6,Wc\xaf\xd7[\xe5\xc4\x95|\xc8d\xfb_\xf8<[)_\x07/\xbf\xe4\xe9\xd2\xb2e\xcbV\xd0\xe9MZL\xc5\xbd&\x0e\xf8g\xf2\xac\x94}\x98\t\x0b\x17S\xd7R \xca\x93P\xd6T\xea\xbdH:!\x1c\xbe\xc0\xac\x02\xee\xb4\xb5\xf5%\xdd9Z\xcf\xce\xaea\x93F\xaa\xdc\xd0p\xb9tjd\xf7\x1e^R\x1e\xbc\x01\xb1\xa6\xa1\xdbkB\xf4mf\x17/\xf1%x\xeb$\xfc\xf1\x92\xff\x94\x90\x90\xf0\x08&\xc9\x0e\x07\xbf\x13y\xe1\xc3\x80-\xe4i\xab\x94\xa51\xfb\x8ecp\xe7)\xb0`\x12Z\x0b\xa0\x9d\xae\xc0/\x90\xfd\x15\xfb\x86\xf7\x15X\xd8$\xf5F\xa8\x05\xd0\xcaS\xf3\x92f\x8f`\x99h\xe1\x9c\x08\xed\xdb\xb7\xbf>\x96\xbd\x8e\xd0\xba\xf7\xde{\x13\xbf\xf9\xe6\x9b%$[K^\x02\x8a\xf2\xc4\xca\x95+\xa7\xd1\xb6j\x1f\x1e\xa3\xe8s\xfa\x9c\x07\x8f\xb2\x1f\xfc\xb1\xe0\x12\x9f\x83I\x97Kr\xac\xe4#\x04K\xee\xe0\'B\xf7!b\xb3\xbdo\xa8\x93\x9d\x98\x98\xf8\xc1\xd9g\x9f\xbd\xf3\xf0\xe1\xc3\x1c\xcf\x84L8\x90\xf4\x94\xfe\xfd\x164%\xe51;\x88\x9b\xfcDJg\xffb3\xdfLb\xa7\'\xe9"\xe97/t1\x83rh\x18\xe5\t\x8a\x85U\xe5-^\xb0\xec\x9d\x8e\x06\x01\xa1?\xbc\xdf\xdf\xc8\x00Ta\x92\x86\xd6G\xd0\xfcT\x853\xc8j5\xe3\xd0S\x9b\xf9\x06\x8d*\x06\xb3(y\x83\x05\x94\xe7q\xfaa\x99\x8c\xb49\x9fI\x81\x8b\xc76\xe5\xb1\xda\xa7\xec\xbb\x94\x94\x94\xdb\x00\xa8\xb2\x18}\xeb\xad\xb7v\xb3\x90j&l+\x1f\xedM\x16\x14\xdax\x8fU\xb17\xe2\x9d\x8f\xec?A\xe9KP\xdc\x7fJY\xd0\x84\x13&\xf4\x91\xaf\xda*KaS\t\x8d\xb1\x17k\xcc\xbe\xf3>\x9c\n$/qC\x8b\x16-\xee\xa9\x8d/^\xb0\x98M\xc1\x17o\xe22\x10:\x1e:t\xc8fr\x99e\xe0.0\xd3\x12\x83;r\xfc\xf8\xf1-UX\x98\xb4m\xf5\xa1\xfc]V\xad\xaf\xc3\xe0\xc5\x05\xc4>\xae\x05|\x8d7\x89\xc1s!\xb2x\xc2\xccG\x8a\x97-[V\x00\xae\xa5\xd8\xd0\xf0\xe0$\x10\x87@\xa4\xe0\xd4\x01\x91\xc3a\x14q\x14\n\xf3m\xb8JA\x05\nW\xe0\xc2\x1aO\x02\xbch\xe7\x8b\x14f\x9e\xc2Cv"\x16\xae\x18\\/\x80\'&\x87\x15\x18Ha\x15\x88\xc1\xf12H\xe2\x015C\xeb}\xfb\xf6\r53\x11b\x9b\x02\xc1o^\x04\xbc\xb8\x80\xd9\xc7\xc9\xb1J{\x93\x18}y\x06Y\x88\x97\xac\xd6\x80\xb9\xfb\x07\x07\x92\x98\xb9a\x03tkl_\x80MF\x11m\xb2T+\xbb\n\xa4J\xa3\x89\xa4\x19\x90\xaaM/\\\x15\xb0_x3V\xf6\x18\\\xa5\xbc\xf89\x0e|~\xf4\x88\x9f\xd5\x11\x96.]*&\xce\n\x15\xcc,=F\xcd\xab\xe9\x90\t\xd4O\x81\x1d\xed\xd4\xa9\xd3[J>\xeeI\xfar\xa3J\x94~\xbc\xad\xe6\xa3\xa5\xfb\xf6\xed\xfb\x19\xf5\xad\t\x89\xba}"\xad\xb0\xf4\xdb&w\xa9\xc7\x04\xf3Z4\xfa\x96\x13!\x1a\x92[\xd6\xb8\x12\xe0En\x8au\xb3mr\xca@Yg\xa6%&\x7f\xd6\xed\xb7\xdf\xde\x85\xe4\x97*<\x94\x163\xce\xf2\xc0\xd1\xde\xcd(\xca\xd9\xe1\xcc\x16\x06\x99m\xf5\x01wY\x94\xb3\xa60M\xd5\x1d\x04\xef\x83\xccZ\xb4W\xca\xf9\xd6\xc7\xdc8\xa8\xcb\xe4/+\x88\x1c\x84JH\xd8\xbf\x7f\xff\x05\xc4\xdb\x82\xb9\xe8\x7f6\x88\x19\x18\r\xc5U\xa0h\xd2i"e\x0c\xa0]ue\x05\xd3\xe5K\xce?l\xd5\xc8\xb7\x05PC\x81\xd8\x1c\xff\r\x17\xf1\x17\xb4\x13\xdc`\x13\'\xa2(r\xce\xf2{\x1b\x012\x94\xd9\x14\x88\xfc"\'N<\xf3\xe2\xfc`\xff\x16t\xa2\x08]\xdaK\xde\xb3gO\x19\xcfI7C\xdfL\xcfZT\x1a\xb4\xb5;*\x02\x85u\xd1\xe2\xdah\xb9\xe5\r\'\x01\xcb\x04\x89\xb5\t\x9c\t\x07\xc0\xb5\xdc\xb2\xa1z\xea\xf9\x89\x93\x94\xd3\x99P\xc3\x8c\x0b\x99o\x17+\x15\xb7\xa2|\xffP\xf2qO\x16\x16\x16\x9e\x15w\xa21\x12d\xb5\xabu\x9f\xe5*P\x8c\xc2<\xdd\xd0x\xf9b\xcf\x1fW\xf9\x06f_\x92\x94B\x1c\x0f/R^\xa1\x80\xae\xe4\n\x8c5\xf3\x0b<\x8c\xf9\x96\xa7\xe07H\x92C\xe4\x98V\x8b\xba4\xce\xea|$F\xfcZ\'.W\x81b\x94\xa4\x13\x8ds\x8f&/;\x14\xe2L\x95oX\x8eh\xcf\x8bW\x0b\x93\xe5\r\x15\x1f\x93\xcf\xda\x17\t\x9cr\xcb|\x83v\x15J\'\x1e\xbc\x06\r\xb4Y\xa46@\xbbb\xce\x9eQ\x9fg\xc5\x8a\x15\xf9*\xcd\xfa\xa4\xdd=P\x0c\xd2\xe3\xe3\x17\x01N\xb6\xf9\t\x93a)\r\xe9h\xe6P\x0cT#\xa30H\xf8\xeda\xb5C\x88l\x9d\xdfS\xe8\xe4\xbf\x85\xda\n\x87\x81\x11\x15H\xf0(_\xc0A\xaa\xa5$\x80\xe4\xccd\x8a\x94q\x16s!\xeed\xd5|\x93\x8b\xa7\x87\xa4\xac!\xc3\x19g\x9cQp\xe4\x88m\xc1h\x87\xd9XX\x9f6\x91g}\xaa\xdb\xeaZ\x03\xc2\x06u36\t\xc8x\x06\xe0\xfc\xe0\x89u.aC\x0e\x9f\xa9\x0b\xae\xcc\xf4\xd5\xda\x03=\xb2\x1d\xc3\x93\x8d\x0cE\x11l_t\xa5\x0fG\x98\x08\xf6E\xae\xa1i\x1c\x86\xfe\x15\xbc\xdd&\x0e\xedve\xe2\xb8D\xf2|h&\xcd\x84\x87\xe2<G\xbeA\xb2yyyrFe)*<\xa5\xc2S\xe7\x06i\xec$\x88\xba\n\x14\xbb\xd0\x8e\xaa\xa8\xec\x07\xceU\xf3\x91\xd2!w\xab\\\xaf?\xe9\xc0\xa0\xee\xcf\n\xe0\xad\x0b\x01\xeap9\xd8\x16\xd6\x00\xb3)\xa6\xad\x94L\xa8|\xa1\x03.\xd7ad\xffc\xd1\x03\xef\x08\xe6[\x9d\xce~X\xddj\xb4\xcd\xfe&\xa6>\xd1\xdej\x07OC\x1d\xf9F\xcb\xba\n\x14\xa3\xe8\x99\xf9v8P\x87;\xf2a\xb3[\xb6l\xb9\x91\xba\xc9j!\x03"\xe2f^\xc53\xd3\xd4\xff\x17\xf6#1\x0f\x1a\x94M\xbe\x80\xa3\x9ab\xa2\x1c\x7f6\xe9E\x8b\xa9\xb7\x08\\k\xf3\x8c\xe2\x0c\x933!`\x03\xcdz\xe0,\xc5|\x8b\xe9V\x84Y\x87\xb8TI\x07\x93\xfc<#&3\x98\xb6\xdfU\xeb\xd2\xfe\xc3\xe1\xee\xf6\xa98\xa7*\xed*P\x8c\x92\xe6%\xaeSQy\x89\x03\xf0R\xf5Va\xce\xf4\xb8q\xe3\x92\x18\x80\xb3\x9cp\xf2uR \xa9\x0f\x9diw\xddu\x97l\x9ek\r\xcc\xec3\xe1/UA<\xcc%S\xebN\x98\x02\xaf\x91d\x7fq\x10\xe0*\xa5\xa0\x1fm\xdf\r=u\xb5\x90\xabBu\rE\xc8\xd0vU\x86I\xe1\xc2X\x88\xb4j\xd5\xea\x15\xf0\xac\xeb4\xf0\xd2\x95\xcb\xa5O\xc6R\xb7\xa1q\\\x05\x8aQ\xc2\x98 \xef8Q\x19\x00\xcfF\x9a\t\xe5\xb7$G\x8f\x1e}\x87\x97]\xc3|\x03\x16u\x17\xcb@\xabQN\x9d>EEEo\xd0^\x8a\x93\x0f5O\xbbS\xc0\xfdW\x15\x06\xb9Yr\xbdG\x85\xd5\x92^\xa0\x96C\xef\t3\x0f\xad\x8fQ\xb2\xcdf>\xd6\x98\xf6\xf9\x1a\xb4\xf1\xa5\x8a\x1f\xcb\xcdo\xc1\x97}\x10\xed\xceP\xebB+\x93\xbd\x10\x16r\x9dn$\xa8$\xe2\x92\x0ezw`F/\xca\xeaymS\xfd\x94\x14_.\xfdIjn\xfe\xff\xc5\xa5\xc7!"\xf4\xb9\x86M\x1e\x8d>\x1b\xecM\x9c\xd6\xaf\xa6\xdau&\x9e\xa4\x99\t?\x00>\x05o\xd1\x9a\xae]\xbb\x96n\xdd\xba\xf5\x026\xdcC)\x93\xeb\xf7\xc1\xcd?/\xff\x15\xd2w(\xf5\xa2N\\\xe0\xdax\xa3>\x1f\xd97\xe4F\xf2`\xda\xdb\x81\x92L\xe6\xc7c\xcb\x19\x94A\x17/p\xf9f\xc3 \xe8O"}\xa3\xd9\x8e\xc4\xd4]\xcb~e\xa6\n\xab-\r\xfe*<nr\x10k\xee\xf3T\xa5u\xee\x91j#g\x95\xc3\xcbz\xf8SW\x9dtd\xb7\x17\x84E\xdc\xf5;\xc4\x84s\x1ei/\xfd\xdaiU\n%\xf8y\xc2l\xfa8D\xed\x1f+\xe3\x14\xbev:\x14y\xccLMM]\x15\xee\xc3*b%\xa0\xa8\xc3\xa8\x97\x86\x1b\x7f\x02\xd7\x93\xe2:\x8e\x82\nD\xc7\x8c\xa2\x8c\xee\x17\x17e\xf5\xe8\xe4\xcf\xd9\xfe\xa2\x93\xf9\xc6\xcc\x17f\xf4\x18/\xec\xc5\x9b\x07\xfa,\xdf9\xa8\x13Y\xea<F\x9d\xf7\xa9d]\xf7\'/\xde\xae?\x1d;vL\xdb\xb4iS%\xe9\xa0LM\xc2\xd4y\x89\xe7i\xf0,\x05\xe2EZ\xf5M\xbcZ\xe2\x17(\xef\xc3#\x17B\xe5N\xd7\x1f\x18\xe0\x0b\x19|{\xc8\x1fg`\x9dO\xdc*\x0c\x8d\x1d(\xc3(\x99\xfd\xc3\x94E\x04\t>4\x171@\'9\x90\x8a\xfd~\x7fL\xa6\xa0\xa3^0\x0b\x8f\x8bH\x8cQ\xcb\x80\xfd\x9a\xfc\xaf\xb9\xae#/\x03Q\xe9+\x88m\xfb7\xc1\x07n\xb0\x17\xbb\x13\x9eVQ\xe7r\x81I =\x80h\x19\xabs\x00y|EZ~v {\xce6\xf20\x99%\x12\x07\x03\xb8?&\x11W\x05\xb2fB_r\xabEF\xc0\x98[\x94\xd1c\x16\x1f\xf6\xb0\r\x82P\xfb\xa742\xe6\xfc\xac%_\x08z^\xd3\x03\x93}-;.\x8bg\xe3\x08R\xceYl}\xc4D\x13wi\xd4\xc0,\xb8\x91\xc1\x7f7/\xb3"\x02\xa2\x8d&8\xf3\xb8\xf8x\x0f\xf1w*>m\x9f\xa9\xe6kK\xd3^\xb9\xcf\xe7\xbb\x95x\xbd\x82+}\xe8L\xbe\x1fq8\xe5YC\x9f\x06\xa2\x0c\xb2\x92\xd49\xd0\xd6Rg%\x81\x85\x9b\xe5\x9dx\x91\xf2\x98~\xef!?\x99\x0c\xc2\x85\xa0\xd9\x1aM6r\xb9\x95\t\xe1:\xf8X\x0c\x01\xdb\xecG=\x99\x10\xbb\xf2\\\xce\xd3\x97\xa7#\x8f\xa5<\xd2 \xf9A\xe1\x1a\xae\x0f\xccR =\xfb\xa3\xe3\x1e]\x9bah\x81G\x8bJ\x0f\xae-\xca\xe8}q}\x08\xd7\xa7\xae|\xd8\xb1\xf8\xc0\xae\x0f\xa1\xc1\xe0\xf3<\x19\xfabO}H\xda\xea\xf2Qs\x99\xa1l\xfb\x0c\x96\xf9b\x1bR\x84\x0cJ\xf42\x03s0/\xf1\x1f\x11Pd\xb6\x14E\xbb\x9d\x01\xf3`\xe8\xa6\xb2S\x81br\x06\xa8\xf4\xe5V0\x83\xe7\x1a\xe8N\x80\xfe?\xd52Gz+\xf9Q\xfc\xdatp\xb8\xdb\xd4\x0e\xdc\x88\xd9\xb6m\xdb\xee\xa1\x1d\xdb\xcaE\xdbs"V\x88\xb1\xe0\x92K.\xb9\x07\xba\xd3A/\x0fW\x85\xb2\xa8\xb2aB(\xa5oc\xb9\x8e\xf3#pWB\xa3$\x1c\x1d\x15\x06\xdeF\xf2\xd9\xf0\xff\x1f*<\x1ei\xdb\x8c\x99\xd2\xc5\xff\xdb\xe2/\x0bG\xa1\xdaWrt\xb6\xb18\xb3\xdb<\xdd\x9b\x9c\x9b2}\xcbI\xcdbue\xb04\xb3G\xe7*\xcd\x98\xccWQ\xff\r\x1e\xe8\xb7\xf6\x91/\xe9\x0en\x04g\xd7\x95TT\xfc\x82\x82\x82\xb3\x9c\x08\x0c\xce\x98\xcd\xc4\xd07\x03.\xe3\xb4\xbf?\x8a\'f\x95\xec\x15\xe4\xbbl{Io\xe4\x05\xdb6\xd9\xf2\xf3b\\\xcb\xd6*\xd1\xbau\xebH+X\x90-\xe8\xd8n"\x98\xbc\x86L\xb1\x1c6\xceOa\xfb_O[=@mG\xb9\x0c\xa2\x83\xf4a-8\xc1\xfd\x03p\xb3\xdaI\xc5\xfc\xe6\x7f\x04\xf4-\xcf\x1b\xf4\xfe\x82B~vR\xc4\x94J\xf0\x1e ;\ty<\x8b\xb7\xf0g\xa4;K1m\x1dc\x80o\xc3[\xb8V\xf2\xb5\x05\xd9\x93\x823\\~\xdb\xc3\xcf\x13\xae\xc6\xb4\xbb\x80|;\xe8$\xc1\xab\xfc\x12\xf5\xb0\xc4\xbc\x9f\xad\xbc\x0f\xf1,\xd6\x1a\xd8W\x8eG\x86\x8f\x9a\x88\xf0R\xab\xab\xbe\x86\x94K\xb2z\x0c\x0c\x18\x01\xf9\xa0|pu\x82\t\x88\x18Ku\xcd\xf3lC\xfc\x1f\x1f:\xac\x97N\xea90P\x15\xf8\x15\x8b\xf2H\x14\'\xf8\xd2\xf86\x1d\x83L\x1f\xe0\x9f\xb1\xfdS\xb3C\xf1\x8a\xb1\x95\xaf\xa0]Y\xe1\xccP\x89\xf0|\x0c\xbeZ\x05fVh\xc8\x98M\xf1s\xd0\xbf\xd7l\x83\x81\xf5\x0cJ\xf8\xb0\x99o\xe8X<}8+\xf2\x91\xd1yf[\xf00\x18\x1eV\x9by7\xfe^\x02\xb6\x15H@)9\xdb\xd7\xf3q\xf7\x7f\xe7\xe4a\xae\xe4\x11b\x0b\xa2q\x98v\xe3\n3\xbb\xed\xc4\xf0Y\x9e\x10\xf0\xbe\x9b\x94\xdc~\xc3\xc9\x9aV\xf2?T\x8b\xbe-\xbf\x02\xed\x1dR\x9c\xd5c$mt\x92\xb6l\xc1c\xa4\xfbs\xf2\xe3\xae<\xa16.Q\xdbb\x92\xd8\xdeT\x94G\xe5\xab\xb1\xd2l\xe83i\xdbR\x1e\xd2Q\xbf\xa4\xdaX|6\x85vk(\x900\x85;\xfb\xd9\xa2\xccn\x9dY\x85\xec6\xa3\xc1\xffu1\xb4\t\x95Z\xd5\x84\xe2\xb2\xafO\xe0^\xde\xc8\xe5\x90\xcfQ\xb3\x9d\x86\x97\xcf\xca\x06\xb4\x02\xaf\xee-\xaeJ\xe0\xbf3T\x19\xbaW\xd7\xfc\xfc\x87\x07\x9f\xa1y\xdb\xf25\x076xZW\x14\xb0O\xf1\xb7\xe5\x97\xa2\x99\t\xac6a\x83G\xd7\x9f\xf0\xe5\xe4\x9f\xb4\xb7\',Q;\xf0\xe7\xf6\xac&\xe6\x80\x1b\x90\x00\xab\xb3\xfc\x13\xac,E\x18\x06\xab\xcf\xe3J\xdeM*\x12\x08\xab@R\xce\x00\xfeO\xdc\xda>\x06\xfa\xfd\n\xbe\x95\x0c\xadL\x03Q\x82\x81A`\xd5\xf7\xea\xc0\xbf\x80\xd4\xb4\x90!T\xbd\x03\xadB\xb7B!\x92\xd6\x84\x8a1\xdd~\xeb\xcb\xcd\x9fj\xa2\xc7;\xc6=;\x00\xdeoV\xe9\xb2\x02-Q\xf3\xcd5\x8d\xe98\x18\xd9,\xa7\xff\xd6\xb8@6y\x98n\x1b\x9a\xabLj\xeb\xb7\xe5\x85s""8\x83\xc3\xcb\x07\x18\xd0\x0fcjU\xeb\x82\x131Ny\xd9\xf3\xb0\xf2\xa4\xfbg\xe4g\xc4\x89d\r2\x0c\x10\xd9\x18\xff\x91\'\xb8\xcf\x12\x04\xfa\xb9\x8b\xcd\xf1\xff\xd4@nf\x00&\x96t\xba\xfcG\x9e$\xb3\xeb\xc8f?\x8f\xb5\xa96\xe1n\\-\x01k\xa6\xa9\x06\xd9S\x0c\xe8g\x8a2{l\xe3_\xd8?\xcf\xc0\xebd/\x8dWN\xdf\xe1\xf5x\xd3\x93s>_\x1b/\x8aB\x07\x8fO\x02\x87\x9b}1Az\xc3\xfb\x18\x1e\xb9\xd8i5\xc1\xe0\x90\x0f\x02\xa6\x13W\x03\xad\xd2\xe6\x91\xc0\x93x%\x9e*<\x9f\x01\xe7\xaa,^\xb1\xa1L.6\x17|\xf3\x90J\xec\xbd\x8c\xb8\x02\xa9$\xfc\xb9\xdb\xff\xe2K\xf2\xf7\xc23\x9a\xc3`\x8b\x9b\xa7\x8a\x95\xad\x94\xff\xd2=\xd9\x7f\xee\x05}\xe3\xad<\xc2?\xd7j|D\x9b\x18\x1c/\x89\xf2\xa8}\xa2\x1f\xf2\x03\xb9\xc7\x19 kTxsJ\xb3\xea\x8c\xe6>\x9f\\\xaf\xb1)\x0f2(Gy\xd2\x90\xcd\x96\xe6$\x8f\x93\xe9kL\n$\x84\xf5\xec\x8d%\xfe\xdc/&x5\xbd\xbb\xecSp\x06\xd4\xfa\xc1\x85H\x0c1x\xbf\xc6v\x9a\xeaIH\xbe\xc87#\x7f\x9a\xfe\xd0;a\x0f\xd5"\xd5\x8f\x15\x8eg\xed\x18\xb8G\x9d\xf8\xb4\xbf\x07\xd8M\x1ct>\xed,kfy\xf5fC\xb0\xeb\xc8f\xb7\x1c\x147\xe7\x89\xa5.c\xc0f\xc2-\\\xb8\xb0SUe\xd5\xb4\xe0l\xad\x07\xff?\xcbz\x04\x9a\xc9\xc9\xfd.\x93hr\xee\xf6\xdd\xa43\xf8\xe8\xfb\xe4\xa2\xb2\xca4\xbcr\xd7\xf3\xdfP\xaf\xc1\x08\xea\x89\x1d\xc4\xa2R3\xb0r\xe1C\xd0\xe5\x03w\x98h\x81\xbf\xa6\xb4\xec\xf86.p\xbc\r\r\x1fd@\xd0\x1f\xf90\x85\xdc\xe8]G\xbc\x94\x8b\x8b/\xd7\xf5;k\r\xcfiu\x0b\xcc\xfe\x1bX5\xd5\x9f#\xc8Iz\xdc\x03\xce\x81]x\xdd\xe4\xbc\xa7;\xb2\x91}\xeeR\xee\xba\xfd\xaa>\xd7u\xe2\xced\x13\'h\r\xf8E\xf3\x16u>\xa1\x9f\xf8\x00avTyF\xb0\xc5\t\x89\t\x03\xd2\xd3\xd3\xf3U\xb83md\xf6m]lT\x9cgx\x8d6\xa8K\x1b\\\xd8\x06\x9e\xec\x02\xcd\xa3\x17\xf8\xabR\xf65\xd6\xbfj\x94/\xcb0 +\xf9\xafg\x07\x1b\xfa\x03\x80N\x99\x9c\x0ey\xcc\xb8\x87y\xe7I\x9c\xc0\xbf\xc4\x8a}Jn\x9c\x9c\x0er\x89\x95GK\x81\xe6\xcf\x9f\xbf\x94\xd5dT\xd8\x8a\xba\xb6\xfa\xfe\xfb\xef\x1f\x1c\xb6\xcc\x05\xba\x12h\xc6\x12\xa8\xde\x03\x19\xda\x90\x88r0\xb4A\x8b\x17/\x96\r\xb9\x1b\\\t\xb8\x12P$P\xad@\x8a\xff_)7\x93\xf2/\x03\xad\xf3\x01\x13\xe8\xc6\xae\x04\x9a\xbb\x04,\x05b\xaf\xf3aDa\xe8\xda\x8e\xb1c\xc7\xca\x0f\x95\xdc\xe0J\xc0\x95\x80"\x01K\x81\xf0\x9f=\x01<\xacg\x0c\xe5\x9a\xa8\xd4q\x93\xae\x04\\\t\x84$`)\x10\xae\xeau\x1e\xafg\x18g<{L\xe9\x90>\x8cb\x8d\xa1\xecU\x13\xe6\xc6\xae\x04\\\tTK\xc0\xf2\xc2\x99 \xf6::\xe7A\xf2C-/\x1f\xca\xd86r\xe4\xc8\x06\xbf\x07g\xb6\xed\xc6\xae\x04N7\t\xfc?\xf6\xc0\'o\xbb<\xe2r\x00\x00\x00\x00IEND\xaeB`\x82'
In [35]:
%%writefile "Aufgabe 8/flask_aufgabe_8d.py"
from flask import Flask, render_template, send_file, redirect, \
                    url_for, abort, make_response
from os import listdir, path

app = Flask(__name__)
app.debug = True
app.env = "development"

@app.route("/",defaults={"path_dir":"","user":""})
@app.route("/homes/<user>/",defaults={"path_dir":""})
@app.route("/homes/<user>/<path:path_dir>")
def show_dir(user,path_dir=""):
    app.logger.info("show_dir({},{})".format(user,path_dir))
    if user:
        app.path = path.join(".",user,"WWW")
        if path.exists(app.path):
            app.path = path.join(app.path,path_dir)
            if path.isfile(app.path):
                return send_file(app.path)
            elif path.isdir(app.path):
                files = listdir(app.path)
                if files:
                    if "index.html" in files:
                        return send_file(path.join(app.path,"index.html"))
                    else:
                        return render_template("filesCss.html",files=files,dirName=path_dir)
                else:
                    app.logger.info("abort(403) no files in directory")
                    return abort(403)
            else:
                app.logger.info("abort(404) not found")
                return abort(404)
        else:
            app.logger.info("abort(403) no www dir")
            return abort(403)
    else:
        app.logger.info("hsa index - no user")
        return render_template("hsa_index.html")

if __name__ == "__main__":
    app.run()
Overwriting Aufgabe 8/flask_aufgabe_8d.py
In [34]:
%%writefile "Aufgabe 8/templates/filesCss.html"
<html>
<head>
  <title>CSV Datei</title>
  <style type="text/css">
.even { background-color:#ffffff; }
.odd { background-color:#e0e0e0; }
  </style>
</head>
<body>
  <h1>Directory "{{ dirName }}"</h1>
    <ul>
{% for file in files %}
      {% if not file.startswith(".") %}
          {% if dirName.endswith("/") %}
              <li class =  "{{loop.cycle('odd','even')}}"> <a href="{{ file }}">{{ file }}</a> </li>
          {% else %}
              <li class =  "{{loop.cycle('odd','even')}}"> <a href="{{ dirName }}/{{ file }}">{{ file }}</a> </li>
          {% endif %}
      {% endif %}
{% endfor %}
    </ul>
</body>
</html>
Overwriting Aufgabe 8/templates/filesCss.html
In [50]:
%%writefile "Aufgabe 8/flask_aufgabe_8e.py"
from flask import Flask, render_template, send_file, redirect, flash, \
                    url_for, abort, make_response, request, session
from os import listdir, path

app = Flask(__name__)
app.debug = True
app.env = "development"
app.secret_key = "agkldjhgvc xkfvo iososigshois218408275"

users = dict()
with open("password.csv") as f:
    content = f.read()
for line in content.split("\n"):
    user,pw = line.split(";")
    users.update({user:pw})
app.logger.info("Users: {}".format(users))
    
@app.route("/")
def index():
    return redirect(url_for("login"))

@app.route("/homes/<user>/",defaults={"path_dir":""})
@app.route("/homes/<user>/<path:path_dir>")
def show_dir(user,path_dir=""):
    app.logger.info("show_dir({},{})".format(user,path_dir))
    if user:
        app.path = path.join(".",user,"WWW")
        if path.exists(app.path):
            app.path = path.join(app.path,path_dir)
            if path.isfile(app.path):
                return send_file(app.path)
            elif path.isdir(app.path):
                files = listdir(app.path)
                if files:
                    if "index.html" in files:
                        return send_file(path.join(app.path,"index.html"))
                    else:
                        return render_template("filesCss.html",files=files,dirName=path_dir)
                else:
                    app.logger.info("abort(403) no files in directory")
                    return abort(403)
            else:
                app.logger.info("abort(404) not found")
                return abort(404)
        else:
            app.logger.info("abort(403) no www dir")
            return abort(403)
    else:
        app.logger.info("hsa index - no user")
        return render_template("hsa_index.html")

@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] not in users.keys():
            error = 'Invalid username'
        else:
            if request.form['password'] != users[request.form['username']]:
                error = 'Invalid password'
            else:
                session['logged_in'] = request.form['username']
                flash('You were logged in')
                return redirect(url_for('show_dir',user=request.form['username']))
    return render_template('login.html', error=error)

@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    flash('You were logged out')
    return redirect(url_for('index'))


if __name__ == "__main__":
    app.run()
Overwriting Aufgabe 8/flask_aufgabe_8e.py
In [40]:
%%writefile "Aufgabe 8/templates/login.html"
{% extends "layout.html" %}
{% block body %}
  <h2>Login</h2>
  {% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
  <form action="{{ url_for('login') }}" method=post>
    <dl>
      <dt>Username:
      <dd><input type=text name=username>
      <dt>Password:
      <dd><input type=password name=password>
      <dd><input type=submit value=Login>
    </dl>
  </form>
{% endblock %}
Writing Aufgabe 8/templates/login.html
In [42]:
%%writefile "Aufgabe 8/templates/layout.html"
<!doctype html>
<title>Apache Simulation</title>
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
<div class=page>
  <h1>Apache Simulation</h1>
  <div class=metanav>
  {% if not session.logged_in %}
    <a href="{{ url_for('login') }}">log in</a>
  {% else %}
    <a href="{{ url_for('logout') }}">log out</a>
  {% endif %}
  </div>
  {% for message in get_flashed_messages() %}
    <div class=flash>{{ message }}</div>
  {% endfor %}
  {% block body %}{% endblock %}
</div>
Overwriting Aufgabe 8/templates/layout.html
In [43]:
%%writefile "Aufgabe 8/static/style.css"
body            { font-family: sans-serif; background: #eee; }
a, h1, h2       { color: #377ba8; }
h1, h2          { font-family: 'Georgia', serif; margin: 0; }
h1              { border-bottom: 2px solid #eee; }
h2              { font-size: 1.2em; }

.page           { margin: 2em auto; width: 35em; border: 5px solid #ccc;
                  padding: 0.8em; background: white; }
.entries        { list-style: none; margin: 0; padding: 0; }
.entries li     { margin: 0.8em 1.2em; }
.entries li h2  { margin-left: -1em; }
.add-entry      { font-size: 0.9em; border-bottom: 1px solid #ccc; }
.add-entry dl   { font-weight: bold; }
.metanav        { text-align: right; font-size: 0.8em; padding: 0.3em;
                  margin-bottom: 1em; background: #fafafa; }
.flash          { background: #cee5F5; padding: 0.5em;
                  border: 1px solid #aacbe2; }
.error          { background: #f0d6d6; padding: 0.5em; }
Writing Aufgabe 8/static/style.css
In [54]:
%%writefile "Aufgabe 8/flask_aufgabe_8f.py"
from flask import Flask, render_template, send_file, redirect, flash, \
                    url_for, abort, make_response, request, session, Markup
from os import listdir, path

app = Flask(__name__)
app.debug = True
app.env = "development"
app.secret_key = "agkldjhgvc xkfvo iososigshois218408275"

users = dict()
with open("password.csv") as f:
    content = f.read()
for line in content.split("\n"):
    user,pw = line.split(";")
    users.update({user:pw})
app.logger.info("Users: {}".format(users))
    
@app.route("/")
def index():
    return redirect(url_for("login"))

@app.route("/homes/<user>/",defaults={"path_dir":""})
@app.route("/homes/<user>/<path:path_dir>")
def show_dir(user,path_dir=""):
    app.logger.info("show_dir({},{})".format(user,path_dir))
    if user:
        app.path = path.join(".",user,"WWW")
        if path.exists(app.path):
            app.path = path.join(app.path,path_dir)
            if path.isfile(app.path):
                return send_file(app.path)
            elif path.isdir(app.path):
                files = listdir(app.path)
                if files:
                    if "index.html" in files:
                        return send_file(path.join(app.path,"index.html"))
                    else:
                        return render_template("filesCss.html",files=files,dirName=path_dir)
                else:
                    app.logger.info("abort(403) no files in directory")
                    return abort(403)
            else:
                app.logger.info("abort(404) not found")
                return abort(404)
        else:
            app.logger.info("abort(403) no www dir")
            return abort(403)
    else:
        app.logger.info("hsa index - no user")
        return render_template("hsa_index.html")

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'GET':
        return render_template('upload.html')
    elif request.method == 'POST':
        f = request.files['upload']
        dateiSpeicher = f.stream.read().decode('utf-8')
        if f.filename.endswith(".csv"):
            dateiZeilen = dateiSpeicher.split('\n')[:-1]
            return render_template('uploadfile.html', dateiZeilen = dateiZeilen, dateiName = f.filename)
        elif f.filename.endswith(".xml"):
            return Markup.escape(dateiSpeicher)
            
@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] not in users.keys():
            error = 'Invalid username'
        else:
            if request.form['password'] != users[request.form['username']]:
                error = 'Invalid password'
            else:
                session['logged_in'] = request.form['username']
                flash('You were logged in')
                return redirect(url_for('show_dir',user=request.form['username']))
    return render_template('login.html', error=error)

@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    flash('You were logged out')
    return redirect(url_for('index'))


if __name__ == "__main__":
    app.run()
Overwriting Aufgabe 8/flask_aufgabe_8f.py
In [51]:
%%writefile "Aufgabe 8/templates/upload.html
<html>
  <head>
    <title>Upload</title>
  </head>
  <body>
    <h1>Upload</h1>
    <form ACTION="/upload" method="POST" enctype ="multipart/form-data">
      <p><input type="file" name="upload"/></p>
      <p><input type="submit" value="Datei hochladen"/></p>
    </form>
    <p>Vielen Dank!</p>
  </body>
</html>
Writing Aufgabe 8/templates/upload.html
In [53]:
%%writefile "Aufgabe 8/templates/uploadfile.html"
<html>
<head>
  <title>CSV Datei</title>
  <style type="text/css">
.even { background-color:#ffffff; }
.odd { background-color:#e0e0e0; }
  </style>
</head>
<body>
  <h1>CSV Datei "{{ dateiName }}"</h1>
    <ul>
{% for dateiZeile in dateiZeilen %}
      <li class =  "{{loop.cycle('odd','even')}}"> {{ loop.index}}. Zeile = "{{ dateiZeile }}" </li>
{% endfor %}
    </ul>
</body>
</html>
Writing Aufgabe 8/templates/uploadfile.html