SINT Rest App Documentation Release 1.0 Florian Sachs 08.04.2014
Inhaltsverzeichnis 1 REST Service 3 1.1 Application................................................ 3 1.2 Konfiguration............................................... 4 1.3 Database (Helper)............................................ 4 1.4 Models.................................................. 4 1.5 SOAP Client............................................... 5 2 Indices and tables 7 Python-Modulindex 9 i
ii
SINT Rest App Documentation, Release 1.0 Hier ist die technische Dokumentation für den REST Part des Projektes. Die App selbst samt Übersicht über die verwendeten Technologien ist unter XXX zu finden. Inhaltsverzeichnis 1
SINT Rest App Documentation, Release 1.0 2 Inhaltsverzeichnis
KAPITEL 1 REST Service Das Service ist unter http://sintrest-sumpfgottheit.rhcloud.com zu finden. Es wird von einer Openshift Instance gehostet. (AWS, Region US). Die Daten werden in einer, auf derselben Instanz befindlichen, Postgresql gehostet. Contents: 1.1 Application Neben der in wsgi.models via Flask-Restless definierten REST Apit ist der Currency Converter ebenfalls durch wsgi.flaskapp.convert_currency() exposed. # Alles OK curl --write-out "\ncode :%{http_code}\n" http://sintrest-sumpfgottheit.rhcloud.com/api/convertcurre { "value": "3065.0" } code :200 # Währung nicht gefunden. Returns -1, aber Status-Code 200 curl --write-out "\ncode :%{http_code}\n" http://sintrest-sumpfgottheit.rhcloud.com/api/convertcurre { "value": "-1.0" } code :200 # Fehlerhafter Aufruf, Status-Code 400 curl --write-out "\ncode :%{http_code}\n" http://sintrest-sumpfgottheit.rhcloud.com/api/convertcurre { "content": "Parameter value, von und nach m\u00fcssen gesetzt sein", "message": "Parameter value, von und nach m\u00fcssen gesetzt sein" } code :400 wsgi.flaskapp.convert_currency() REST Service, dass den Currency Converter in wsgi.soapclient.convert_currency_via_wsdl() für die Umrechnung selbst nutzt. wsgi.flaskapp.create_db() Call models.initialize_database() and recreate the database. Zeige die Daten an wsgi.flaskapp.index() Zeige alle vorhandenen Routen in der Applikation 3
SINT Rest App Documentation, Release 1.0 1.2 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. 1.3 Database (Helper) Um Circular import zu verhindern wird db in einem eigenen Modul definiert. Diesen Trick hab ich mir in http://piotr.banaszkiewicz.org/blog/2012/06/29/flask-sqlalchemy-init_app/ abgeschaut. flask.ext.sqlalchemy greift auf die Variable SQLALCHEMY_DATABASE_URI zu. Diese wird in den Dateien config_rhc.py, respektive config_local gesetzt. Die Entscheidung, ob rhc oder local geladen wird, wird anhand der Environment Variable OPENSHIFT_APP_UUID getroffen. database.db ist somit die gemeinsame DB-Instanz für diese App. Jedes Modul kann somit gefahrlos ein from database import db machen und es gibt keine Ungereimtheiten, welche Session nun genutzt wird. 1.4 Models Die Datenmodelle für SQLAlchemy Definition der SQLALchemy Modelle. Flask-Restless generiert daraus eine REST Api mit CRUD Operationen, wobei die in SQLALchemy definierten Relationships berücksichtigt werden. Interessant ist primär die Methode Leihe.kosten(), die das Webservice für die Währungsumrechnung nutzt. class wsgi.models.car(**kwargs) Ein Automobil. station Zeigt an, bei welcher Station das Auto steht, kann auch None sein class wsgi.models.kunde(**kwargs) Die Kundin oder der Kunde, der oder die sichs ausborgt class wsgi.models.leihe(**kwargs) Speichert wer welches Auto von wann bis wann ausgeliehen hat oder ausleihen wird. Die Verknüpfungen zu den anderen Modellen ist als relationship modelliert. kosten() Gib die Kosten für die Leihe in der Währung des Kunden zurück. Wenn keine spezielle Währung für den Kunden gefunden wird oder die Berechnung fehlschlägt, gib den Betrag in Euro zurück. Für die Berechnung wir wsgi.soapclient.convert_currency_via_wsdl() verwendet. Rückgabe (string) - Wert und Währungskürzel. zb: 1.12 EUR, 3.9 CHF returned wurde das Auto wieder zurückgegeben? station_abhol Von welcher Station wird das Auto abgeholt 4 Kapitel 1. REST Service
SINT Rest App Documentation, Release 1.0 station_return Wo wird das Auto zurückgegeben, resepektive wo wurde es zurückgegeben class wsgi.models.station(**kwargs) Eine Leihstation hat einen Namen und eine Adresse. Diese wird bei der Distanzberechunung genutzt. wsgi.models.initialize_database() Initialisiere die Datenbank mit Testdaten. Alle vorhandenen Daten werden gelöscht. 1.5 SOAP Client The SoapClient für die CurrencyConversion. Mit suds kann man einfacher herausfinden, was sich hinter einem WSDL versteckt. Leider wirft suds eine Fehler bei der Abfrage selbst. Es kann jedoch sehr gut verwendet werden, um herauszufinden welche Methoden das Webservice anbietet: In [1]: from suds.client import Client In [2]: WSDL_URL="http://lnurn3.schlof.net:8080/SOAP_CurrencyConverter/wsdl/CurrencyConverter.wsdl" In [3]: client = Client(WSDL_URL) In [4]: print client Suds ( https://fedorahosted.org/suds/ ) version: 0.6 Service ( CurrencyConverterService ) tns="http://project.sint.mic2.fhtw" Prefixes (0) Ports (1): (CurrencyConverter) Methods (2): getconversionrate(xs:double _val, xs:string _fromcur, xs:string _tocur) getcurrencylist() Types (0): Für die tatsächliche Abfrage habe ich dann SOAPpy verwendet. Der tatsächliche Aufruf sieht dann so aus: server = WSDL.Proxy(WSDL_URL) return server.getconversionrate(value, von, nach) von und nach sind Währungskürzel wie EUR, CHF, HUF... Das Webservice wsgi.soapclient.convert_currency_via_wsdl() wird von wsgi.models.leihe.kosten() aufgerufen. wsgi.soapclient.convert_currency_via_wsdl(value, von, nach) Rufe den Currencyconverter auf und gib den Wert zurück 1.5. SOAP Client 5
SINT Rest App Documentation, Release 1.0 6 Kapitel 1. REST Service
KAPITEL 2 Indices and tables genindex modindex search 7
SINT Rest App Documentation, Release 1.0 8 Kapitel 2. Indices and tables
Python-Modulindex w wsgi.config, 4 wsgi.database, 4 wsgi.flaskapp, 3 wsgi.models, 4 wsgi.soapclient, 5 9