Schlangenhochzeit in-der Wolke - Pyramid auf Google Appengine

download Schlangenhochzeit in-der Wolke - Pyramid auf Google Appengine

If you can't read please download the document

description

Googles Appengine steht für hochskalierbare Anwendungen in der Cloud. Locandy ist unser Startup für mobile Location based Games. Auf der Cloud-Platform mit ihrer sehr restriktiven Python-Umgebung haben wir das Portal für Spieler, Autoren und Business Kunden umgesetzt. Browser, Mobile-App und PDF-Server werden damit bedient. Dabei ist nicht alles so rund gelaufen, wie wir es gerne gehabt hätten. Die Probleme wurden gelöst - dank Python mit seinem starken Werkzeugkasten. Der Vortrag geht kurz auf die Anforderungen ein, zeigt auf welche Probleme es gab und wie wir sie gelöst haben. In einem Github Repository stelle ich ein Buildout inkl. kleiner Beispielapplikation mit den meisten dieser Lösungen zur Verfügung.

Transcript of Schlangenhochzeit in-der Wolke - Pyramid auf Google Appengine

  • 1. 3. Deutsche Python-Konferenz Kln 2013Schlangenhochzeit in der Wolke Python / Pyramid auf Googles AppengineJens W. Klein [email protected] http://kleinundpartner.at 16.10.2013 1 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz.

2. Quelle: Internet http://www.focus.de/fotos/bei-einer-symbolischen-schlangenhochzeit-hoffen-bewohner-eines_mid_809519.html2 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 3. 3 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 4. 4 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 5. 5 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 6. 6 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 7. Startup Unternehmen mit Sitz in InnsbruckLocation based Gamesgefrdert durch die FFG (stereichische Forschungs-Frderungs-Gesellschaft) von 1/2012 bis 6/20134 GesellschafterKUP: Gesellschafter seit 11/2012KUP-Aufgaben: Projektmanagement, Development Support, Portalumsetzung 7 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 8. 8 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 9. Anforderungen 1 Entwicklung eines Mixed Reality Media Formats fr Location based Games. Entwicklung eines MRM-Players fr Smartphones HTML5/Javascript basiert100% Offline-fhig Native App stellt nur Laufzeitumgebung zur VerfgungEntwicklung eines Editors fr das MRM-Format9 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 10. Anforderungen 2 Entwicklung eines Portals fr eine wachsende Locandy-Community fr Spieler und Autoren, kommerzielle Kunden und Werbetreibende.das Portal soll skalierbar sein,verfgbar sein undkaum Personalaufwand fr Hosting verursachen.10 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 11. Anatomie SucheAppengine Google CloudAndroid/ iOS (native)Download PORTALAPP SpielergebnisBrowser HTML5 JavascriptApache Cordova Webview + PluginsEditorPlayer SpielPlayer Vorschau11 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 12. 12 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 13. Google Appengine 1: Google sagt wird bei grter Belastung und hohen Datenmengen zuverlssig ausgefhrt wird. Automatische Skalierung und Lastenausgleich Eine lokale Entwicklungsumgebung mit allen Funktionen, die Google App Engine auf Ihrem Computer simuliertAufgaben-Queue auerhalb einer WebanfrageCron-Job-hnliche Zeit/ Intervall Aufgabenhttps://developers.google.com/appengine/docs/ whatisgoogleappengine?hl=de 13 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 14. Google Appengine 2 Cloud Plattform von Google seit 2008Applikationen laufen in einer SandkisteProgrammiersprachen: Python - erste untersttzte SpracheJava - hufigst genutzte SpracheGo - Google Eigenentwicklung, NischePHP - erst seit wenigen Monaten14 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 15. Google Appengine 3 eingeschrnkter Funktionsumfang der Sprache Laden von externen URLs ber eigene API/DienstMail muss ber eigene API/Dienst verschickt werdenkeine Egg-Untersttzung, Sockets, Tempfiles, Dateisystem nur ROkeine Python C-Erweiterungen mglichBlobstorage/ Google Cloudstorage erfordert spezielle Handhabung von Binrdaten eigene Objekt-Datenbank 15 von 36...uvm. Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 16. 16 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 17. Pyramid 1 FOSS Python WebframeworkAusgewhltes Bestes aus der Welt von Django,Zope,Pylons,und einigen anderen Inspirationen.Der Kern ist Minimal, nur wenige Vorgaben, dafr viele Add-Ons um verschiedene Ziele zu erreichen. 17 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 18. Pyramid 2 Die Qual der Wahl Urlmatch oder Traversal? Oder beides?Datenbank relational oder objektorientiert?Mako, Chameleon-ZPT, Jinja oder was als Template-Sprache?Welche Art von Authentifizierung und Authorisierung?Strukturierung des Projektes nach Layern, nach Fachklassen oder wie sonst?...? 18 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 19. Pyramid 3 Pyramid ist komplett Komponenten basiert, verwendet Zope Kompenenten Archiktektur, aber versteckt sie fr den Otto-NormalProgrammmierer. Es gibt viele fertige Komponenten, die einem das Leben leicht machen, und es werden stndig mehr! Hinter Pyramid steht eine noch kleine aber sehr lebendige Community. 19 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 20. 20 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 21. Hochzeit Pyramid mit Appengine Pfarrer ist zc.buildoutcollective.recipe.appengine spielt die Musik noch unreleased, code auf githubFork von eingeschlafenem Projekt appfy.recipe.appenginewir lieben Pull-Requests!automatische Installion von Appengine SDK, Tools und Development Server,mixt aus Eggs eine Baumstruktur.21 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 22. app Pyramid mit zc.buildout auf appengine app.yaml 1: Struktur vor buildout gaefixes.pymain.py pkg_resources.py Python Wurzel settings.yaml aus Sicht der Appengine static [... css, png, jpg, ...] bootstrap.py buildout.cfg versions.cfg ab hier Egg-Struktur gaetools.cfg source example_app setup.cfg ab hier example_app, setup.py Wurzel aus Sicht src von Python example_app __init__.py [...] 22 von 36 Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 23. Pyramid mit zc.buildout auf appengine 2: Beispiel CodeAller Code und Buildout lauffhig auf http://github.com/jensens/pyramid-gae-tutorial23 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 24. Pyramid mit zc.buildout auf appengine 3: buildout laufen lassen Python 2.7Virtual-Env grer Version 1.9$ cd path/to/buildout $ virtualenv --no-site-packages--no-setuptools --clear . $ ./bin/python2.7 bootstrap.py $ ./bin/buildout24 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 25. Pyramid mit zc.buildout auf appengine 4: nach dem Lauf ./bin enthlt dev_appserver und viele andere tools, jedoch nicht alle bentigt in der Appengine, ./app/distlib enthlt Eggs in Baum aufgelst ./app/example_app ist symbolischer Link auf die Python Wurzel der Beispiel App, ./parts/appengine_sdk enthlt das offizielle Google Appengine SDK, ./var ist angelegt, dort wird die Datenbank der Entwicklungsumgebung abgelegt. 25 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 26. Pyramid mit zc.buildout auf appengine 5: dev_appserver starten ./bin/dev_appserver startet den Entwicklungsserver die App luft per default auf http://localhost:8080 die Admin-Benutzeroberflche luft auf http://localhost:9000 die Einstellungen fr den dev_appserver werden aus der Datei ./gaetools.cfg eingelesen.26 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 27. 27 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 28. Kommunikation in der Ehe GAEFixes Fixes/ Monkeypatches sind leider tw. notwendigmssen als erstes im main.py geladen werdensys.path anpassenpkg_resources im Entwicklermodus: Appengine import_hook registrieren chameleon zpt im Entwicklermodus: Patchen des Debug Lade-Modus, da keine Tempfiles erlaubt sind. zudem evtl. Library spezifische Hacks. 28 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 29. Initialisierung der Pyramid App settings.yaml enthlt Pyramid- und AppEinstellungen Google-mig als YAML (normalerweise in Pyramid im INI-Format), main.py wie fr normale WSGI-Anwendungen und stellt hier Pyramid application Objekt zur Verfgung, main.application ist in appengine config file app.yaml fr alle Anfragen registriert, statische Ressourcen knnen direkt via Appengine Routing ausgeliefert werden. 29 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 30. 30 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 31. Debugging Probleme und der Wert des Testens pdb funktioniert im dev_appserver nicht!print funktioniert nicht (aber logging geht),scheinbar gibt es Remote-Debugging hooks -> noch nicht ausprobiert, -> kompliziert einzurichten, -> nur fr Eclipse, evtl. andere IDEs mglich; pdb in Tests funktioniert, ipdb (ipython) funktionert in Tests. interlude interaktive Konsole fr Doctests funktioniert (inkl. ipython). 31 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 32. Test getriebene Entwicklung Appengine bietet Funktionen um verschiedene Teile der Laufzeitumgebung zu starten und stoppen (Datastore, Blobstore, Memcache usw.),Test/Testumgebung muss diese verwenden,Nose-Tests: nosegae ! -> nicht lauffhigeigenen Testrunner geschrieben, zu unflexibelschlielich zope.testrunner mit Appengine verheiratet dann plone.testing Test-Layers integriert 32 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 33. Tests in Schichten plone.testing + zope.testrunner Layers werden fr Test Fixtures (Test Ausstattungen) genutzt, die von mehreren TestFllen gemeinsam genutzt werden, vereinfacht/ vereinheitlicht Setup/ Teardown Aufteilung z.B. pure Python Tests, Tests mit Datenbank, Tests gegen Webserver, ..., bzw.: Unit-Test, Functional-Tests und IntegrationTests, bei sehr vielen Tests schnellere Ausfhrung. 33 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 34. Test-Beispiel 1: mit Datenbank, ohne Webtest creating a first node:: >>> from example_app import models >>> node = models.create_node('test1', ... 'Test One', 'This is a first test.') >>> node TreeModel(key=Key('TreeModel', 'test1'), body=u'This is a first test.', title=u'Test One')trying to create a node that already exists raises ValueError:: >>> node = models.create_node('test1', 'X', 'X') Traceback (most recent call last): ... ValueError: node with name test1 already exists34 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 35. Test-Beispiel 2: mit Datenbank und Webtest >>> node = models.create_node('test1', 'Test One', ... 'This is a first test.') >>> node TreeModel(key=Key('TreeModel', 'test1'), body=u'This is a first test.', title=u'Test One')>>> response = layer.webtest.get('/test1') >>> 'Test One' in response True >>> 'This is a first test.' in response True>>> response = layer.webtest.get('/nonexistent', ... status='404', expect_errors=True) >>> response.status '404 Not Found' 35 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz. 36. 36 von 36Text: Creative Commons Namensnennung-Keine kommerzielle Nutzung- Keine Bearbeitung 3.0 sterreich Lizenz.