我有一个 FastAPI 应用程序,如果我手动移动它们(即通过更改浏览器地址栏中的
/<path>
),某些路线可以正常工作。例如,这是其中之一:
@task.get('/tasks', response_model=list[Task], tags=["Tasks"])
def find_all_tasks():
print("\n[*] Showing all Tasks\n")
return tasksEntity(conn.local.task.find())
我的
/root
路线加载显示按钮的 index.html
文件。我想要做的是每当我单击按钮时将上述路由添加到 URL(例如,http://127.0.0.1/tasks
)。
我使用
Jinja2Templates
从 API 的不同路径渲染 HTML 中的数据,但我不知道如何从前端 HTML 按钮移动它们。
您的
/tasks
端点(即 find_all_tasks
函数)应返回一个新的 Jinja2 TemplateResponse
,其 list
为 tasks
。例如:
@app.get('/tasks')
def find_all_tasks(request: Request):
tasks = ['task 1', 'task 2', 'task 3']
return templates.TemplateResponse("tasks.html", {"request": request, 'tasks': tasks})
tasks
页面在
index.html
中,您可以使用 url_for()
函数获取端点的 URL 并允许用户单击它,例如:
<a href="{{ url_for('find_all_tasks') }}">Click me</a>
或
<form action="{{ url_for('find_all_tasks') }}">
<button>Click me</button>
</form>
或
<button onclick="location.href='{{ url_for('find_all_tasks') }}';">Click me</button>
或
<input type="button" onclick="location.href='{{ url_for('find_all_tasks') }}';" value="Click me"/>
或者,您可以使用相对路径,如here和here所述,传递路由名称和任何所需的路径/查询参数。例如:
<a href="/tasks">Click me</a>
如果您的端点包含 path 和/或 query 参数,请查看 thisanswer 和 thisanswer 了解如何包含这些参数。
tasks
在
tasks.html
模板中,您可以循环并输出大括号内的tasks
,如这个答案和下面所示:
<!DOCTYPE html>
<html>
<body>
{% for task in tasks %}
<tr>
<td>{{ task }}</td><br>
</tr>
{% endfor %}
</body>
</html>