Django - Eigene API schreiben! >>> How to???

Django, Flask, Bottle, WSGI, CGI…
Antworten
t3c404
User
Beiträge: 11
Registriert: Mittwoch 15. Februar 2017, 11:07

Guten Tag zusammen,

ich hoffe ich bin hier richtig mit meinem Thema.
Ich würde gerne eine Cipher-Suite schreiben, die wie folgt aufgebaut ist.

Webseite - API - Code

Das ganze soll Modular aufgebaut sein.
Die Webseite enthält nachher eine Eingabemaske in der ich z.B. einen Base64 String eingebe. Nachher soll es mir den entschlüsselten Wert zurückgeben. Die einzelnen Verschlüsselungen sollen in verschiedenen Sprachen geschrieben werden können, z.B. Python, Java etc. Das hat den Sinn, dass jeder eine Verschlüsselung schreiben kann, egal in welcher Sprache und diese über die API angesprochen werden kann. Jetzt möchte ich mir eine eigene API schreiben, welche nachher einfach nur den eingegebenen String abschickt, alle Verschlüsselungen durchprobiert und mir die Ergebnisse wieder zurück gibt. Dabei möchte ich JSON als Datenformat benutzen.
Ich wollte das mit Django machen, habe aber überhaupt keine Ahnung wie das ganze abläuft und aussehen sollte.
Könnte mir dabei jemand einen Tipp geben?

Hier ein Beispiel von einem Python Code!

Code: Alles auswählen

import base64

def base64Encoding():
    inputString = raw_input("String for encoding!\n")
    return base64.b64encode(inputString)

print base64Encoding()
Ich hoffe es ist klar was ich damit meine?!?
Ich habe davor noch nie so etwas gemacht und mir fehlt da grob das Verständnis wie das alles zusammenspielen soll/kann/muss...


Grüße

t3c404
Zuletzt geändert von Anonymous am Donnerstag 29. Juni 2017, 16:28, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@t3c404: Es ist klar, aber auch nicht. Du beschreibst da ganz grob ein grösseres Projekt — und was ist nun die konkrete Frage?

Wie immer beim Programmieren: Teil das Problem in kleinere Teilprobleme auf, und die wieder in kleinere Teilprobleme, solange bis ein Teilproblem trivial lösbar ist und die Lösung testbar ist. Dann setzt Du die ganzen getesteten Teillösungen zu grösseren Teillösungen zusammen, bis am Ende das Gesamtproblem gelöst ist.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Es ist klar, aber auch nicht.
+1

Ich habe das so verstanden, dass die einen zentralen Server hast, der ein Webseite ausliefert, wo man eine kodierten String eingeben kann. Dieser wird an den Server zurück geschickt, und dieser verteilt den String an sagen wir mal "Worker". Je Kodierung gibt es genau einen Worker, der in einer beliebigen Sprache geschrieben sein kann, richtig?

Dann ist die erste Frage: wie soll denn der Server mit den Workern sprechen? Du musst da ja was universelles nehmen wie einen RPC oder jeder Worker stellt eine einfach REST-API bereit oder die Kommunikation läuft über Sockets oder ...? Was ist hier dein Plan? Die Umsetzung der Kommunikation ist IMHO der Knackpunkt bei diesem Projekt.

Abgesehen davon gibt es hier IMHO genau _keinen_ Grund, Django einzusetzen. All die Vorteile, die Django bietet, brauchst du hier nicht bzw. bringen dir nichts.

Gruß, noisefloor
t3c404
User
Beiträge: 11
Registriert: Mittwoch 15. Februar 2017, 11:07

Ich habe das so verstanden, dass die einen zentralen Server hast, der ein Webseite ausliefert, wo man eine kodierten String eingeben kann. Dieser wird an den Server zurück geschickt, und dieser verteilt den String an sagen wir mal "Worker". Je Kodierung gibt es genau einen Worker, der in einer beliebigen Sprache geschrieben sein kann, richtig?
Genau.
Was ich vergessen habe zu sagen. Ich mache das Projekt mit anderen Leuten zusammen. Das ganze soll nachher in Docker laufen, sodass es auf jedem Rechner lokal laufen kann.
Meine Aufgabe ist jetzt erst mal eine REST-API zu schreiben, die etwas entgegen nimmt und weiterleitet.
Django habe ich erwähnt, da mein Kollege meinte ich solle das mit einem Web-Framework versuchen. Ich selber habe davon leider keine Ahnung.

Also konkrete Aufgabe: Schreibe einen Service, dass wenn ich {'b81ac816fc9...'} abschicke, ich dann {'mySecret123'} als Antwort bekomme. Das war nur ein Beispiel wie es nachher aussehen soll. Mein Kollege meinte noch, dass wir eben mit JSON als Datenformat arbeiten sollen.

Danke schon mal für die Hilfe!



Gruß

t3c404
BlackJack

@noisefloor: Naja, ein Grund für Django ist das es so etwas wie ”Standard” ist, auch wenn es für dieses Projekt jetzt erst einmal zu viel mit bringt. Andererseits gibt es eine Menge Erweiterungen für Django, wie beispielsweise etwas um Celery einzubinden, was hier schon wieder sinnvoll werden könnte wenn das an verschiedene Worker nacheinander gereicht werden soll, und damit durchaus Zeiten zustande kommen könnten die zu lang für einen normalen Anfrage/Antwort-Zyklus sind.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Meine Aufgabe ist jetzt erst mal eine REST-API zu schreiben, die etwas entgegen nimmt und weiterleitet.
Ok - das ist auch nicht weiter schwer. Mit Bottle oder Flask oder Hug kriegst du das mit ca. 10 Zeilen Code hin.

Mit Django ist das im Prinzip auch nicht viel mehr Code - nur verteilt auf zwei Dateien plus die notwendigen Anpassungen an der Konfiguration. So wie es sich anhört, ist Webentwicklung Neuland für dich? Dann ist Django vielleicht am Anfang etwas "too much".

@BlackJack: Als Kernvorteil sehe ich in erster Instanz die hohe Integration von Templates, ORM und Formularframework plus die ganzen Sicherheitsfeature, die Django eingebaut hat. Und das braucht der TE ziemlich sicher nicht. Je nach dem, wie sich das entwickelt, können die vielen Django-Extensions natürlich ein (großer) Vorteil sein. Basierend auf dem aktuellen Stand der Dinge wäre IMHO Flask einfacher zu handhaben. Und lt. Flask-Doku wäre auch hier die Celery Integration einfach.

Gruß, noisefloor
t3c404
User
Beiträge: 11
Registriert: Mittwoch 15. Februar 2017, 11:07

noisefloor hat geschrieben:Hallo,

Mit Django ist das im Prinzip auch nicht viel mehr Code - nur verteilt auf zwei Dateien plus die notwendigen Anpassungen an der Konfiguration. So wie es sich anhört, ist Webentwicklung Neuland für dich? Dann ist Django vielleicht am Anfang etwas "too much".
Webentwicklung ist durchaus Neuland. Ich komme mit Python momentan ganz gut zurecht, ansonsten habe ich mal etwas HTML, CSS etc gemacht. Aber ein Projekt welches das alles verknüpft hatte ich noch nicht. Mir fehlt hier das Verständnis wie das alles miteinander kommunizieren kann.
Könntet Ihr mir eine Seite etc empfehlen bei der ich das besser verstehe? Auch wenn es nur 10 Zeilen Code sind habe ich keinen Schimmer wie das aussehen soll.

Danke!



Gruß

t3c404
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das Grundprinzip der Webententwicklung mit Python ist Dank WSGI ziemlich einfach: die bindest eine Funktion an eine Route (=eine URL). Beim Aufruf der URL wird die Funktion ausgeführt und liefert das Ergebnis zurück.

"Nacktes" WSGI willst du aber nicht nutzen, weil relativ umständlich. Dafür gibt es Frameworks (wie Bottle, Flask, Hug, CherryPy, Django, ...), die das vereinfachen.

Im folgenden Mal ein simples Beispiel ohne jegliche Fehlerbehandlung für eine einfache REST-Schnitte: auf der Route `/decode_base64` wird als POST-Request ein JSON-Object der Form `{'string': hier_steht_der_base64_string}` und liefert als Antwort im JSON-Format `{'result`: hier_steht der_dekodierte_string}`. Als Webframework kommt Bottle zum Einsatz:

Code: Alles auswählen

import base64
import bottle

app = bottle.Bottle()

def decode_from_base64(encoded):
    return base64.b64decode(encoded)

@app.post('/decode_base64')
def decode_base64():
    encoded = bottle.request.json
    decoded = decode_from_base64(bytes(encoded['string'], encoding='ascii'))
    return {'result': decoded.decode('utf-8')}

if __name__ == '__main__':
    bottle.run(app)
Abfrage mittels HTTPie:

Code: Alles auswählen

$ http POST http://localhost:8080/decode_base64 string=Zm9vYmFy
HTTP/1.0 200 OK
Content-Length: 20
Content-Type: application/json
Date: Thu, 29 Jun 2017 18:28:57 GMT
Server: WSGIServer/0.2 CPython/3.5.2

{
    "result": "foobar"
}
Mir fehlt hier das Verständnis wie das alles miteinander kommunizieren kann.
DAS ist ja genau das, was die Umsetzung des ganzen tricky macht, siehe vorherige Post. Die REST-Schnittstell ist der einfache Part.

Gruß, noisefloor
t3c404
User
Beiträge: 11
Registriert: Mittwoch 15. Februar 2017, 11:07

Vielen Dank, jetzt wird das alles klarer.
Sobald das Projekt mal ein Stück weit am laufen ist werde ich euch mal den Stand zeigen.
Soll ja nachher in Docker laufen und wird dann auf Github zur Verfügung stehen.

Ein schönes Wochenende :)


Gruß

t3c404
t3c404
User
Beiträge: 11
Registriert: Mittwoch 15. Februar 2017, 11:07

Jetzt muss ich doch noch was fragen....

Wenn ich den Code bei mir ausführe, dann bekomme ich einen 404 Error.
Bottle hab ich über pip installiert. Muss ich noch eine Erweiterung installieren oder wo kann der Fehler liegen?

Ich gebe in der url "127.0.0.1:8080/decode_base64 string=test" ein und dann kommt der Fehler (auch wenn ich http:// davor schreib)


Fehler:

Code: Alles auswählen

Error: 404 Not Found

Sorry, the requested URL 'http://127.0.0.1:8080/decode_base64%20string%3Dtest' caused an error:

Not found: '/decode_base64 string=test'
Wenn ich folgenden Code laufen lassen, dann funktioniert es!

Code: Alles auswählen

from bottle import route, run

@route('/hello')
def hello():
    return "Hello World!"

run(host='localhost', port=8080, debug=True)
Irgendwie hat er ein Problem mit der Abfrage.



Gruß

t3c404
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ich gebe in der url "127.0.0.1:8080/decode_base64 string=test" ein und dann kommt der Fehler (auch wenn ich http:// davor schreib)
Ist ja auch richtig so. Die URL lautet `http://127.0.0.1.:8080/decode_base64` und dort wird als POST-Request mit den Daten `string=irgendwas` erwartet. Wenn du einen GET-Request an die URL sendest (was du gemacht hast), bekommst du einen Fehler.

In meinem Beispiel habe ich dir Abfrage mit HTTPie gemacht, das ist quasi CURL in modern. Alleine in der Adressezeile des Browsers kannst du die URL nicht sinnvoll aufrufen, weil du dann die gewünschten POST-Daten nicht mitsenden kannst. Dazu brauchst du HTTPie oder CURL oder eine Webseite mit Formular, was die Daten also POST-Request schickt oder irgendein anderes Programm, was eine HTTP-Request mit POST-Daten senden kann.

Gruß, noisefloor
t3c404
User
Beiträge: 11
Registriert: Mittwoch 15. Februar 2017, 11:07

Achso ok. Ja das macht Sinn :oops:

Vielen Dank für deine Zeit.
Ich werde mich dann mal intensiv damit beschäftigen.


Gruß

t3c404
Antworten