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

Django, Flask, Bottle, WSGI, CGI…
Antworten
Kanaille
User
Beiträge: 3
Registriert: Samstag 4. April 2020, 14:56

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ß
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@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?
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

@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})
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@rogerb: Die Einrückungen stimmen schon, einfach auf "zitieren" klicken, dann siehst Du sie.
Das hatte ich gemacht. Daher kam die Anmerkung.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

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]
Kanaille
User
Beiträge: 3
Registriert: Samstag 4. April 2020, 14:56

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.
Antworten