es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La solicitud de post de FastAPI no está generando la plantilla de jinja2.

He realizado la llamada de publicación y rendericé la plantilla jinja2 de login_form.html.

main.py:

from fastapi import FastAPI, Response, status, HTTPException, Depends
import hashlib
from fastapi import APIRouter, Form
from pydantic import BaseModel
from fastapi.staticfiles import StaticFiles
from fastapi import Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()

templates = Jinja2Templates(directory="templates")

@app.post("/", response_class=HTMLResponse)
async def login_form(
    request: Request, uname: str = Form(...), passcode: str = Form(...)
):
    print(uname, passcode)
    return templates.TemplateResponse(
        "auth/login_form.html", {"request": request, "result": "res"}
    )

login_form.html:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Login Form</title>
    </head>
<body>
<h1>Login Form</h1>
<form method="post">
<h5>Username</h5>
<input type="text" name="uname" placeholder="username">
<h5>Password</h5>
<input name="passcode" placeholder="password" type="text">
<input type="submit">
</form>

<p>{{result}}</p>
</body>
</html>

Cuando cargo la página en el navegador web obtengo:

none
{“detail”:”Método no permitido”}

loading the webpage of

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error “Método no permitido” sugiere que el método HTTP utilizado para acceder al punto final no está permitido. En este caso, el método POST está permitido para el punto final /, pero parece que el navegador web está utilizando un método HTTP diferente para cargar la página.

    Para probar el método POST y renderizar la plantilla Jinja2 de login_form.html, puedes utilizar una herramienta como curl o postman para hacer una solicitud POST al punto final con los datos del formulario adecuados.

    Por ejemplo, utilizando curl en la línea de comandos:

    curl -X POST -d "uname=miusuario&passcode=micontraseña" http://localhost:8000/
    

    Esto hará una solicitud POST al punto final / con los datos del formulario uname=miusuario&passcode=micontraseña. La respuesta debería ser la plantilla login_form.html renderizada, con el resultado siendo “res”.

    Alternativamente, podrías modificar la función login_form para que también maneje las solicitudes GET y devuelva la plantilla con un resultado vacío inicialmente. Por ejemplo:

    @app.route("/", methods=["GET", "POST"])
    def login_form():
        if request.method == "POST":
            uname = request.form.get("uname", None)
            passcode = request.form.get("passcode", None)
            print(uname, passcode)
            return render_template("auth/login_form.html", result="res")
        else:
            return render_template("auth/login_form.html", result="")
    

    Esta función actualizada maneja tanto las solicitudes GET como las POST al punto final /. Cuando se realiza una solicitud POST con los datos del formulario, imprime los datos y devuelve la plantilla con el resultado establecido en “res”. Cuando se realiza una solicitud GET, devuelve la plantilla con un resultado vacío.

Comments are closed.