Обработка форм в FastApi

Через шаблонизатор Jinja сделал форму. Зашел по адресу. Нажимаю отправить и выходит:

{"detail":[{"loc":["body","username"],"msg":"field required","type":"value_error.missing"}]}

Если зайти на страницу документации и отправить данные оттуда - то никаких ошибок нет и в принте можно видеть введенные данные.

Обработку POST делал по документации

@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
    return templates.TemplateResponse("sign_in.html", {"request": request})

@app.post("/")
async def login(username: str = Form(), password: str = Form()):
    print('username:', username)
    print('password:', password)
    return {"username": username}

Что не так я сделал? Почему не могу видеть отправленные данные я через форму, размещенной на странице sign_in.html?

Сама форма:

<form name="sign_in" id="form_0" action="/" method="post" enctype=multipart/form-data>
  <div class="input">
    <div class="blockinput">
      <input type="email" name="email" placeholder="e-mail">
    </div>

    <div class="blockinput">
      <input type="password" name="password" placeholder="Пароль">
    </div>
  </div>
  <div>
    <input class="in_submit" type="submit" value="Войти">
  </div>
</form>

ДОПОЛНЕНИЕ:

@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
    print('*@app.get*')
    return templates.TemplateResponse("sign_in.html", {"request": request})

@app.post("/")
async def login(username: str = Form(), password: str = Form()):
    print('*@app.post*')
    print('username:', username)
    print('password:', password)
    return {"username": username}

Принты при заходе на страницу '127.0.0.1' через браузер:

*@app.get*
INFO:     127.0.0.1:64572 - "GET / HTTP/1.1" 200 OK
INFO:     127.0.0.1:64572 - "POST / HTTP/1.1" 422 Unprocessable Entity
INFO:     127.0.0.1:64572 - "GET /favicon.ico HTTP/1.1" 405 Method Not Allowed

А это в браузере после отправки: введите сюда описание изображения Принты, при отправке данных через страницу 'http://127.0.0.1:8001/docs#/default/login__post'

*@app.post*
username: [email protected]
password: wwwwww
INFO:     127.0.0.1:64600 - "POST / HTTP/1.1" 200 OK

Ответы (1 шт):

Автор решения: Алексей Белкин

Во-общем, я разобрался. Оставлю решение если кто тоже будет грызть гранит в этом вопросе:

Обращаем внимание на имена в форме:

..
 <input type="email" name="email" placeholder="e-mail">
 <input type="password" name="password" placeholder="Пароль">
..

В обработчике ссылок д/б те же имена:

@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
    return templates.TemplateResponse("sign_in.html", {"request": request})


@app.post("/submitform")
async def index(email: str = Form(...), password: str = Form(...)):
    print('email:', email)
    print('password:', password)
    return RedirectResponse("/", status_code=303)

Вот и все. После отправки данные приходят в /submitform. Там можно с ними работать и потом можно редиректить (я на ту же страницу с которой отправлял).

→ Ссылка