Tengo una página con una tabla de estudiantes. Agregué un botón que le permite agregar una nueva fila a la tabla. Para hacer esto, redirijo al usuario a una página con formularios de entrada.
El problema es que después de enviar los formularios completos, el usuario accede a una nueva página vacía. ¿Cómo transferir datos en formularios completos y redirigir al usuario a la tabla?
Recién comencé a aprender programación web, así que decidí primero hacer una implementación sin usar tecnologías AJAX.
Código:
from fastapi import FastAPI, Form from fastapi.responses import Response import json from jinja2 import Template app = FastAPI() # The page with the table @app.get('/') def index(): students = get_students() # Get a list of students with open('templates/students.html', 'r', encoding='utf-8') as file: html = file.read() template = Template(html) # Creating a template with a table # Loading a template return Response(template.render(students=students), media_type='text/html') # Page with forms for adding a new entry @app.get('/add_student') def add_student_page(): with open('templates/add_student.html', 'r', encoding='utf-8') as file: html = file.read() # Loading a page return Response(html, media_type='text/html') # Processing forms and adding a new entry @app.post('/add') def add(name: str = Form(...), surname: str = Form(...), _class: str = Form(...)): add_student(name, surname, _class) # Adding student data # ???Para empezar, en los casos en los que devuelva plantillas jinja2, debe devolver una TemplateResponse, como se muestra en la documentación . Para redirigir al usuario a una página específica, puede usar RedirectResponse . Dado que lo hace a través de un método POST (y no GET) (como se muestra en su ejemplo), se generará un error 405 (Método no permitido) . Sin embargo, gracias a @tiangolo , puede cambiar el código de estado de respuesta a status_code=status.HTTP_303_SEE_OTHER y el problema se resolverá. A continuación se muestra un ejemplo de trabajo. En caso de que necesite pasar la ruta y/o los parámetros de consulta a sus puntos finales en el futuro, eche un vistazo a esta o esta respuesta también.
from fastapi import FastAPI, Request, Form, status from fastapi.templating import Jinja2Templates from fastapi.responses import RedirectResponse app = FastAPI() templates = Jinja2Templates(directory="templates") # replace with your own get_students() method def get_students(): return ["a", "b", "c"] @app.post('/add') async def add(request: Request, name: str = Form(...), surname: str = Form(...), _class: str = Form(...)): # add_student(name, surname, _class) # Adding student data redirect_url = request.url_for('index') return RedirectResponse(redirect_url, status_code=status.HTTP_303_SEE_OTHER) @app.get('/add_student') async def add_student_page(request: Request): return templates.TemplateResponse("add_student.html", {"request": request}) @app.get('/') async def index(request: Request): students = get_students() # Get a list of students return templates.TemplateResponse("index.html", {"request": request, "students": students})