Seite 1 von 1

FastAPI Porbleme mit Funktion die ich innerhalb einer Form Unterscheidung ausführen möchte

Verfasst: Mittwoch 27. Oktober 2021, 12:43
von Kanaille
Hallo Leute,

ich hoffe euch spricht das Thema an bzw. jemand kann mir helfen.

Ich versuche eine Weboberfläche zu gestallten mit der ich meine MQTT Geräte ansprechen kann. Vorallem mache ich das auch um dabei was über Webframeworks und Python zu lernen.

Das steht bei mit im main.py:

@app.get("/knoepfe")
def form_get(request: Request):
return templates.TemplateResponse('knoepfe.html', context={'request': request})

@app.post('/knoepfe')
def form_post(request: Request, action: str = Form(...)):
if action == 'convert':
async def mqtt_test():
await mqtt.publish("cmnd/Lampe/POWER","OFF")

return templates.TemplateResponse('knoepfe.html', context={'request': request})
elif action == 'download':
zwei = "das hat er gecheckt"
return templates.TemplateResponse('knoepfe.html', context={'request': request, 'check': zwei})

und das ist die html seite davon:
<body>
<form method="post">
<input type="submit" name="action" value="convert">
<input type="submit" name="action" value="download">
</form>

<p>hö? {{check}}</p>
</body>

Die Funktion mqtt_test() wird nicht ausgeführt.

wenn ich das so ausführe, geht's:
if action == 'convert':
async def mqtt_test():
await mqtt.publish("cmnd/Lampe/POWER","OFF")



Kann mir jemand helfen?
Gruß

Re: FastAPI Porbleme mit Funktion die ich innerhalb einer Form Unterscheidung ausführen möchte

Verfasst: Mittwoch 27. Oktober 2021, 13:05
von rogerb
@Kanaille,

es sieht mir so aus, als wäre die Einrückung falsch. Kannst du das mal in </> code tags posten, damit man die von dir verwendete Einrückung sehen kann.
Ich glaube du solltest alle Funktionsdefinitionen async setzen. Verschachtelte Definitionen würde ich gar nicht machen.
mqtt_test wird auch nicht aufgerufen /awaited. Fehlt da was?

Re: FastAPI Porbleme mit Funktion die ich innerhalb einer Form Unterscheidung ausführen möchte

Verfasst: Mittwoch 27. Oktober 2021, 13:35
von Sirius3
@rogerb: Die Einrückungen stimmen schon, einfach auf "zitieren" klicken, dann siehst Du sie.

@Kanaille: wenn Du asynchrone Aufrufe in einer Funktion hast, dann muß die Funktion auch async definiert werden. mqtt_test wird gar nicht benutzt.

Code: Alles auswählen

@app.get("/knoepfe")
def form_get(request: Request):
    return templates.TemplateResponse('knoepfe.html', context={'request': request})

@app.post('/knoepfe')
async def form_post(request: Request, action: str = Form(...)):
    if action == 'convert':
        await mqtt.publish("cmnd/Lampe/POWER","OFF")
        return templates.TemplateResponse('knoepfe.html', context={'request': request})
    elif action == 'download':
        zwei = "das hat er gecheckt"
        return templates.TemplateResponse('knoepfe.html', context={'request': request, 'check': zwei})

Re: FastAPI Porbleme mit Funktion die ich innerhalb einer Form Unterscheidung ausführen möchte

Verfasst: Mittwoch 27. Oktober 2021, 14:05
von rogerb
@rogerb: Die Einrückungen stimmen schon, einfach auf "zitieren" klicken, dann siehst Du sie.
Das hatte ich gemacht. Daher kam die Anmerkung.

Re: FastAPI Porbleme mit Funktion die ich innerhalb einer Form Unterscheidung ausführen möchte

Verfasst: Mittwoch 27. Oktober 2021, 14:38
von rogerb
Also das war definitiv falsch, kann aber durch die Verwendung von BBCode passiert sein

Code: Alles auswählen

[b]        async def mqtt_test():
            await mqtt.publish("cmnd/Lampe/POWER","OFF")[/b]

Re: FastAPI Porbleme mit Funktion die ich innerhalb einer Form Unterscheidung ausführen möchte

Verfasst: Donnerstag 28. Oktober 2021, 06:02
von Kanaille
Hallo,

super, so hat es geklappt !

tausend Dank euch :D

Bin richtig begeistert, dass mir hier so schnell geholfen wurde. Ich war schon richtig down, weil es nicht klappen wollte, habe den halben Tag versucht. Ich lese mir dann wohl mal was zu async und await an.

das ist die python Seite:

Code: Alles auswählen

@app.post('/knoepfe')
async def form_post(request: Request, action: str = Form(...)):
    if action == 'convert':
        await mqtt.publish("cmnd/Lampe/POWER", "OFF")
        return templates.TemplateResponse('knoepfe.html', context={'request': request})
    elif action == 'download':
        await mqtt.publish("cmnd/Lampe/POWER", "ON")
        zwei = "das hat er gecheckt"
        return templates.TemplateResponse('knoepfe.html', context={'request': request, 'check': zwei})
das HTML:

Code: Alles auswählen

        <form method="post">
            <input type="submit" name="action" value="convert">
            <input type="submit" name="action" value="download">
        </form>

        <p>hö? {{check}}</p>
Vielen Dank.