{ geekBlog }

a geeky blog about things

Reinvent the Wheel: Webframeworks (Teil 2)

am 9. Januar 2019 von cp

Als nächstes schauen wir uns GET-Paramter an und verwenden eine Python-Library, welche einem nahezu beliebig viele Aufgaben abnimmt, welche beim Erstellen einer eigenen Webanwendung anfällt: Werkzeug

Fangen wir direkt mit einem Beispiel an, bei welchem wir die Parameter aus der Umgebungsvariabel QUERY_STRING auslesen:

from werkzeug.serving import run_simple


def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')])

    body = '<html><head><title>Reinvent web frameworks part 2 - 1st example</title></head><body>\n'
    qs = environ.get('QUERY_STRING', '')
    body += f'<pre>{qs}</pre>\n'
    body += '</body></html>\n'

    return [body.encode('utf-8')]


if __name__ == '__main__':
    run_simple('localhost', 8000, application)

Ruft man das Ganze nun mit folgendem Query auf:

http://localhost:8000/?foo=äöü&ä=ß

Erhält man (wenn man Glück hat) irgendwas kryptisches wie:

foo=%C3%A4%C3%B6%C3%BC&%C3%A4=%C3%9F

Oder schlimmeres.

Reinvent the Wheel: Webframeworks (Teil 1)

am 2. Januar 2019 von cp

Auf der PyCon 2017 hielt Jacob Kaplan-Moss einen sehr interessanten Talk mit dem Titel "Let's build a web framework!". Davon inspiriert möchte ich mich hier auch an das Thema wagen, denn wie er in dem Talk schon sagte: "Das Rad neu zu erfinden ist eine tolle Idee, wenn man mehr über Räder lernen will."

Ein kleiner Disclaimer an dieser Stelle: Wie so oft gibt es nicht den einen richtigen Weg bzw. die eine richtige Lösung. Mein Lösungsansatz war im Folgenden, es möglichst anschaulich zu gestalten. Wer dazu noch Verbesserungsvorschläge hat kann dies gerne auf GitHub machen.

Ein paar Grundlagen

Um die Schnittstelle zwischen Webserver und Webframework oder Webapplication zu standardisieren definierte man im Dezember 2003 mit PEP 333 das Python Web Server Gateway Interface (WSGI) und machte es 2010 mit PEP 3333 auch Python 3 kompatibel. Da wir uns (zumindest ich mich) in dieser Serie um die Webframework-Seite kümmern wollen betrachten wir den Server-Teil weniger und halten uns an die Schnittstellen-Definition um mit jeden beliebigen WSGI-Server reden zu können.

Django Secret Key erzeugen

am 7. Februar 2018 von cp

Je nachdem, wie man seine Django-Konfiguration verwaltet, stellt sich die Herausforderung, dass man einen neuen Secret-Key benötigt. Und an der Stelle möchte ich jedem dazu raten, niemals seinen Secret Key auf mehreren Rechnern zu nutzen (außer es ist ein Cluster, da ist es quasi ein Muss) oder gar in ein VCS zu importieren.

Da Django hier nichts spezielles vorgibt, kann der String an sich beliebig aussehen, solange er nicht leer ist. Somit kann man z.B. pwgen benutzen, wenn man sich einen neuen Key erstellen möchte. Um ebenfalls einen 50-Zeichen langen Key zu erhalten (django-admin.py startproject erzeugt einen 50 Zeichen langen Key), kann man z.B. folgendes ausführen:

$ pwgen -sy 50 1

Um das gleiche zu machen, wie Django auch, kann man sich folgendes Skript schreiben:

import random

random = random.SystemRandom()
chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
length = 50
print(''.join(random.choice(chars) for i in range(length)))