SINT Rest App Documentation Release 1.0 Florian Sachs September 04, 2015
Contents 1 Applikation 3 2 Rest Service 5 3 SOAP Service 7 4 Technologiestack 9 5 Deployment 11 6 Aufgabe 1: Google Webservice Nutzen 13 7 Aufgabe 2: REST Service Entwickeln 15 8 Aufgabe 3: Webservice nutzen 17 9 Contents 19 9.1 Vewendung der Google API....................................... 19 9.2 Application................................................ 19 9.3 REST API aufrufe............................................ 20 9.4 Konfiguration............................................... 21 10 Indices and tables 23 Python Module Index 25 i
ii
SINT Rest App Documentation, Release 1.0 Download der in der LV präsentierten Präsentation Contents 1
SINT Rest App Documentation, Release 1.0 2 Contents
CHAPTER 1 Applikation Applikation App Dokumentation Source 3
SINT Rest App Documentation, Release 1.0 4 Chapter 1. Applikation
CHAPTER 2 Rest Service REST Service REST Dokumentation Source 5
SINT Rest App Documentation, Release 1.0 6 Chapter 2. Rest Service
CHAPTER 3 SOAP Service SOAP Service URL SOAP Dokumentation 7
SINT Rest App Documentation, Release 1.0 8 Chapter 3. SOAP Service
CHAPTER 4 Technologiestack Frontend und Webservice sind in Python geschrieben, das Webservice in Java Python 2.7 Flask - Webframework SQLALchemy - Persistenz Layer Postgresql - Relationale Datenbank Bootstrap - Front End Sphinx - Documentation Generator WTForms - HTML Form Helper ReadTheDocs - Documentation Hosting Requests - HTTP for Humans Flask Restless 9
SINT Rest App Documentation, Release 1.0 10 Chapter 4. Technologiestack
CHAPTER 5 Deployment Applikation http://sintapp.herokuapp.com/leihen/ Heroku, AWS, EU Region Python REST Service http://sintrest-sumpfgottheit.rhcloud.com OpenShift - Red Hats Cloud Angebot, AWS, US Region Python Webservice http://lnurn3.schlof.net:8080/soap_currencyconverter/wsdl/currencyconverter.wsdl Netcup Serverhousing, Nürnberg, DE Java Redis Cache um nicht mehr als 2.500 Abfragen auf Googleapi zu machen RedisLabs, AWS, US Region 11
SINT Rest App Documentation, Release 1.0 12 Chapter 5. Deployment
CHAPTER 6 Aufgabe 1: Google Webservice Nutzen Wählt man unter http://sintapp.herokuapp.com/kunden/ einen Kunden aus und klickt auf Neue Leihe werden die Verleihstationen der Distanz von der Kundenadresse bis zur Station sortiert angeboten. Die Google API wird mittels Vewendung der Google API angesprochen. 13
SINT Rest App Documentation, Release 1.0 14 Chapter 6. Aufgabe 1: Google Webservice Nutzen
CHAPTER 7 Aufgabe 2: REST Service Entwickeln Die Kommunikation zwischen Applikation und Backend erfolg ausschliesslich über REST calls. In Application können die einzelnen Funktionen im Source betrachtet werden. Die REST Api selbst ist unter http://sintrest.readthedocs.org zu finden. In REST API aufrufe werden die Wrapperfunktionen für den Aufruf dargestellt. 15
SINT Rest App Documentation, Release 1.0 16 Chapter 7. Aufgabe 2: REST Service Entwickeln
CHAPTER 8 Aufgabe 3: Webservice nutzen Das REST Service verwendet seinerseits das SOAP Service, um abhängig von dem Land, indem der Kunde wohnt die Kosten für die Leihe in die entsprechende Währung umzurechnen. Genaueres ist in http://sintrest.readthedocs.org/soapclient.html dokumentiert. Wie man sehen kann ist Herr Zurbriggen Schweizer und die entsprechenden Kosten werden in Schweizer Franken angezeigt, während Herr Nagy seine Forint bekommt. 17
SINT Rest App Documentation, Release 1.0 18 Chapter 8. Aufgabe 3: Webservice nutzen
CHAPTER 9 Contents 9.1 Vewendung der Google API Verwendet die Google API um die Distanz und die Fahrzeit zwischen zwei Adressen herauszufinden. Die Google API wird als einfaches REST Webservice mit JSON verwendet. Die Parametrisierung erfolgt vollständig über URL-Parameter. Die Adresse selbst wird als Property von models.kunde und models.station aus den vorhandenen Daten erstellt. Das Umrechnen der Adresse int die Koordination erfolgt transparent durch das Webservice. wsgi.googleapi.get_distance(von, nach) Liefert Distanz und Fahrzeit zwischen zwei Adressen zurück. Da bei der Google Api für die gratis Variante nicht mehr als 2.500 Anfragen alle 24 Stunden gestellt werden dürfen, werden die Ergebnisse der Anfragen in einer Redis DB zwischen gespeichert und Google wird nur dann gefragt, wenn die RedisDB für diese Adresspaar keine Einträge hat. Als RedisDB wurde das freie (25MB, keine Datenpersistenz) Cloudprodukt von www.redislabs.com gewählt. Die RedisDB steht dabei in der AWS-Zone US Eastern. Parameters von Adressstring für den Ausgangspunkt nach Adressstring für das Ziel Returns tuple: dict von get_distance_from_google() ; redis-cache-hit: true false wsgi.googleapi.get_distance_from_google(von, nach) Liefert die Distanz und die Dauer fuer die Fahrt zwischen 2 Adressen zurueck. Verwendet dazu die Google Distance Matrix aus https://developers.google.com/maps/documentation/distancematrix/ Parameters von Adressstring für den Ausgangspunkt nach Adressstring für das Ziel Returns dict { distance : { text : distance_text, value : int(distance_value)}, duration : { text : duration_text, value : int(duration_value)}} 9.2 Application wsgi.flaskapp.cars_list() List all Cars 19
SINT Rest App Documentation, Release 1.0 wsgi.flaskapp.create_db() Call models.initialize_database() and recreate the database wsgi.flaskapp.kunden_delete(kunde_id) Löschen eines Kunden - aber nur wenn er keine offenen Leihen gibt. wsgi.flaskapp.kunden_edit(kunde_id=none) Legt entweder einen neuen Kunden an oder editiert einen bestehenden. Wie immer gibt es das Problem, das create und update sehr ähnlich sind - hier habe ich beides auf einmale implementiert. Mgl kann mit Classbased Views strukturierter vorgegangen werden wsgi.flaskapp.kunden_list() List all Kunden wsgi.flaskapp.leihe_neu1(kunde_id) Klickt man bei der Kunden-Detail View auf Neue Leihe werden in dieser View anhand der Adresse des Kunden die Distanzen zu unseren Verleihstationen berechnet und als Tabelle angezeigt. wsgi.flaskapp.leihen_edit(leihe_id=none) Create und update for Leihen. Wertet auf die URL-Query Parameter kunde_id und station_id aus, die die entsprechenden Felder voreinstellen. 9.3 REST API aufrufe Das REST Modul verwendet die Requests Library, um mit dem Verleihnix REST Service zu kommunizieren. Die bereitgestellen Funktionen sind minimale Wrapper um die entsprechenden HTTP-Calls. Auf REST-Service Seite wird die von Flask Restless <https://flask-restless.readthedocs.org/en/latest/> generierte API angesprochen. Wenn ein Requests fehlschlägt wird eine Exception geraised. wsgi.rest.rest_delete_id(s, key) Löscht ein Element Parameters s tablename des Models, das geholt werden soll key id des Models wsgi.rest.rest_get_all(s) Liste mit allen Objekten des Models. Parameters s tablename des Models, das geholt werden soll Returns Liste mit allen Objekten für s wsgi.rest.rest_get_id(s, key) Return ein einzelnes Element mit der gegeben id Parameters s tablename des Models, das geholt werden soll key id des Models Returns dict - Modell wsgi.rest.rest_post(s, data) Erstellt ein neues Modell. 20 Chapter 9. Contents
SINT Rest App Documentation, Release 1.0 Parameters s tablename des Models, das geholt werden soll data dict - key und value entpsrechen den Attributen des Models wsgi.rest.rest_put(s, key, data) Updated ein Modell Parameters s tablename des Models, das geholt werden soll key id des Models data dict - key und value entsprechend den Attributen des Modells 9.4 Konfiguration Ein from config import * werden die korrekte Konfiguration importiert. Da diese sinnvollerweise - es befinden sich secrets drin - in git gespeichert wird, wird sie in../../../data/config/rhc-sint/ als config_rhc.py und config_local.py abgelegt. Diese Verzeichnisstruktur kann 1:1 in OpenShift verwendet werden, da dieses data/ Verzeichnis bei einem Neustart der App vorhanden bleibt. Anhand der Umgebungsvariable OPENSHIFT_APP_UUID wird entschieden, welche der Configs geladen werden soll. 9.4. Konfiguration 21
SINT Rest App Documentation, Release 1.0 22 Chapter 9. Contents
CHAPTER 10 Indices and tables genindex modindex search 23
SINT Rest App Documentation, Release 1.0 24 Chapter 10. Indices and tables
Python Module Index w wsgi.config, 21 wsgi.flaskapp, 19 wsgi.googleapi, 19 wsgi.rest, 20 25
SINT Rest App Documentation, Release 1.0 26 Python Module Index
Index C cars_list() (in module wsgi.flaskapp), 19 create_db() (in module wsgi.flaskapp), 19 G get_distance() (in module wsgi.googleapi), 19 get_distance_from_google() (in module wsgi.googleapi), 19 K kunden_delete() (in module wsgi.flaskapp), 20 kunden_edit() (in module wsgi.flaskapp), 20 kunden_list() (in module wsgi.flaskapp), 20 L leihe_neu1() (in module wsgi.flaskapp), 20 leihen_edit() (in module wsgi.flaskapp), 20 R rest_delete_id() (in module wsgi.rest), 20 rest_get_all() (in module wsgi.rest), 20 rest_get_id() (in module wsgi.rest), 20 rest_post() (in module wsgi.rest), 20 rest_put() (in module wsgi.rest), 21 W wsgi.config (module), 21 wsgi.flaskapp (module), 19 wsgi.googleapi (module), 19 wsgi.rest (module), 20 27