Flask-API mit Ein- und Ausgabe

Django, Flask, Bottle, WSGI, CGI…
Antworten
.py
User
Beiträge: 3
Registriert: Montag 29. März 2021, 23:53

Dienstag 30. März 2021, 00:34

Hallo,

ich würde gerne die Flask-API als Ein- und Ausgabe nutzen. Es soll wie folgt aussehen:

Nutzer übergibt String via POST-Request
Dieser String wird in eine Variable übergeben
Mit dem String in der Variablen wird ein Algorithmus ausgeführt
Am Ende soll das Ergebnis des Algorithmus wieder per API zurückgegeben werden

Code: Alles auswählen

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
    strinput = request.data 

if __name__ == '__main__':
    app.run(debug=True)
Dazwischen kommt der Algorithmus

strinput ist die Eingabe
strout ist das was rauskommt und wieder an den Akteur via API übergeben werden soll

Code: Alles auswählen

@app.route('/')
def index():
    return jsonify(strout)

if __name__ == '__main__':
    app.run(debug=True)
Nun zu den Fragen:

1. Muss die Angabe des

Code: Alles auswählen

app.run(debug=True)[
zweimal erfolgen oder nur einmal? Wenn einmal, an welcher Stelle, erstere oder zweitere?

2. Damit in- und output funktioniert, reicht es wenn die app.route identisch angegeben ist oder muss das def auch identisch sein?

3. Leider kann die Variable strinput nicht deklariert werden, so wie es im obigen Beispiel beschrieben ist. Es heißt bei der Ausführung, dass die Variable nicht befüllt/deklariert ist. Wie ist hierbei vorzugehen?
Benutzeravatar
__blackjack__
User
Beiträge: 8553
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dienstag 30. März 2021, 15:15

@.py: Die Frage ist etwas komisch. Fast so als wolltest Du zwei Programme schreiben wobei eines die Eingabe entgegen nimmt und das andere die Ausgabe liefert. Das geht so nicht. Es darf nur ein Programm geben und die `route()` auch nur einmal, und darüber kommen die Daten rein, und dann auch wieder raus/zurück zum Client. Also beispielsweise:

Code: Alles auswählen

#!/usr/bin/env python3
from flask import Flask, jsonify

app = Flask(__name__)


@app.route("/", methods=["GET", "POST"])
def index():
    return jsonify(request.data)


if __name__ == "__main__":
    app.run(debug=True)
Allerdings solltest Du mal nachlesen was das `data`-Attribut enthält, beziehungsweise unter welchen Umständen das etwas enthält. Diese Umstände müsstest Du also auch herbeiführen, oder das ganze anders lösen. Letzteres würde ich empfehlen, denn das so zu machen wäre zumindest mal ungewöhnlich.

Ad 3. Konkreter Code und eine dazugehörige konkrete, komplette Ausnahme/Fehlermeldung samt Traceback ist besser als so eine Umschreibung. Deklariert wird da nix und `strinput` ist nicht das Problem sondern der Ausdruck auf der rechten Seite der Zuweisung.
“Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”
.py
User
Beiträge: 3
Registriert: Montag 29. März 2021, 23:53

Montag 5. April 2021, 13:40

Danke für deine Antwort. Vielleicht verstehe ich noch nicht das Prinzip, aber irgendwie müssen die eingegeben Daten verarbeitet werden. Wäre ja etwas sinnbefreit, wenn ich etwas eingebe und die identische Eingabe kommt zurück oder ist es nur dafür gedacht, dass ein "OK" zurückgegeben wird? Also beispielsweise möchte ich einen Eintrag in der Datenbank löschen, ich führe den gewünschten Datensatz auf, welchen ich löschen möchte und im Anschluss wird einfach nur ein ausgeführt oder fehlgeschlagen zurückgegeben?
Benutzeravatar
__blackjack__
User
Beiträge: 8553
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Montag 5. April 2021, 17:09

@.py: Wo ist das Problem da jetzt die Daten zu verarbeiten? Du kannst in der Funktion machen was Du willst. Also zum Beispiel halt einfach die Eingangsdaten als JSON zurück senden. Du kannst da auch beliebige andere Sachen mit den Daten machen. Der Punkt ist das die pro Anfrage auf dem Endpunkt / für POST- und GET-Anfragen aufgerufen wird, irgendetwas macht, und die Antwort in passender Form liefert. Und zwar diese eine Funktion und nicht irgendwie auf mehrere Dateien verteilte Funktionen mit gleicher Signatur/Dekoratoren auf irgendwie magische Weise zusammen arbeiten.
“Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”
Benutzeravatar
noisefloor
User
Beiträge: 3170
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Montag 5. April 2021, 17:16

Hallo,

du musst das allgemeiner sehen. In der Funktion, die du an die Route bindest, kann beliebiger Code stehen. Also alles, was du mit den empfangenen Daten machen willst. Was du dann zurück lieferst, ist deine Sache. Hängt auch davon ab, was mit den Daten gemacht wird.

Simples Beispiel:

Code: Alles auswählen

rom flask import Flask, jsonify, request

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def double():
    number = int(request.args.get('number', ''))
    result = 2*number
    return jsonify({'result': result})

if __name__ == '__main__':
    app.run(debug=True)
Wenn du jetzt `http://localhost:5000?number=2` auf dem Rechner, auf dem das Skript läuft, aufrufst, bekommst du als JSON `result: 4` zurück. Statt JSON könntest du natürlich auch HTML über ein Template zurück geben. Statt die Eingabe `number` einfach nur zu verdoppeln kannst du da auch komplexeren Code einbauen.

Gruß, noisefloor
Antworten