python 如何通过点击Jinja2模板中的HTML按钮来浏览FastAPI路由?

hxzsmxv2  于 2022-11-21  发布在  Python
关注(0)|答案(2)|浏览(148)

我有一个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中(即127.0.0.1/tasks)。
我使用Jinja2Templates从API的不同路径呈现HTML中的数据,但我不知道如何从前端HTML按钮移动它们。

yuvru6vn

yuvru6vn1#

前端

您可以使用url_for()函数,例如:

<a href="{{ url_for('find_all_tasks') }}">Click me</a>

<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"/>

或者,您可以使用相对路径,如herehere所述,传递路由名称和任何必要的路径/查询参数。例如:

<a href="/tasks">Click me</a>

如果您的端点包含 path 和/或 query 参数,请查看this answerthis answer,了解如何包含这些参数。
后端
然后,您的/tasks端点应该返回一个新的Jinja 2 TemplateResponse,其中listtasks。例如:

@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.html模板中,您可以在大括号内输出循环变量,如this answer及以下所示:

<!DOCTYPE html>
<html>
    <body>
        {% for task in tasks %}
            <tr>
                <td>{{ task }}</td><br>
            </tr>
        {% endfor %}
    </body>
</html>
xpcnnkqh

xpcnnkqh2#

根据这个answer,你可以使用app.url_path_for('find_all_tasks')来得到你的路线的url。你可以把它作为一个参数传递给Jinja,然后在你的模板中你想要这样的东西

<form action="{{ find_all_tasks_route }}">
    <input type="submit" value="Go to all tasks" />
</form>

(拍摄于here
其中find_all_tasks_route是传递给渲染器的参数。

相关问题