Bil*_*bab 4 python http jinja2 web fastapi
我有一个包含学生表格的页面。我添加了一个按钮,允许您向表中添加新行。为此,我将用户重定向到带有输入表单的页面。
问题是,提交完成的表单后,用户会转到一个新的空白页面。如何传输已完成表单中的数据并将用户重定向回表格?
我刚刚开始学习Web编程,所以我决定先不使用AJAX技术来实现。
代码:
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
# ???
Run Code Online (Sandbox Code Playgroud)
首先,如果您返回 Jinja2 模板,您应该返回 a TemplateResponse,如文档中所示。要将用户重定向到特定页面,您可以使用RedirectResponse。由于您通过 POST(而不是 GET)方法执行此操作,如示例所示,因此405 (Method Not Allowed)会引发错误。但是,感谢 @tiangolo ,您可以将响应状态代码更改为status_code=status.HTTP_303_SEE_OTHER,然后问题将得到解决(请查看此答案和此答案以获取更多详细信息)。下面给出了一个工作示例。
如果您需要将其他路径和/或查询参数传递到端点,请同时查看此答案和此答案。
如果您必须使用 Fetch API 而不是 HTML执行相同的操作<form>,请查看此答案。
应用程序.py
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})
Run Code Online (Sandbox Code Playgroud)
模板/index.html
<!DOCTYPE html>
<html>
<body>
<h1>Students: {{ students }}</h1>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
模板/ add_student.html
<!DOCTYPE html>
<html>
<body>
<form action="http://127.0.0.1:8000/add" method="POST">
name : <input type="text" name="name"><br>
surname : <input type="text" name="surname"><br>
class : <input type="text" name="_class"><br>
<input type="submit" value="submit">
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6048 次 |
| 最近记录: |