如何在模板中使用 Flask 的 url_for ?

EdC*_*ase 5 python flask

我正在构建一个 Flask 应用程序来使用 SQL 数据库管理 RPG 的字符表。

目前,我有以下脚本显示数据库中当前用户的字符列表。

@app.route("/<cha_name>")
@login_required
def character_sheet():
    characters = db.execute(
        """SELECT
          *
        FROM
            characters
        WHERE
            user_id = :user_id AND
            name = :cha_name
        """,
        user_id=session["user_id"],
        cha_name="???",
    )

    if not characters:
        return render_template("add_char.html")
Run Code Online (Sandbox Code Playgroud)

我想包括一个按钮,用于导航到特定所选字符的字符表。因此,下面的页面将详细介绍该角色的一些统计数据,然后一个按钮会将用户带到另一个页面上填充的角色表。

这就是我迄今为止用于显示特定用户角色的内容。

{% extends "main.html" %}

{% block title %}
    Characters
{% endblock %}

{% block main %}
      <table border = 1>
         <thead>
            <td>Player</td>
            <td>Name</td>
            <td>Race</td>
            <td>Class</td>
            <td>Level</td>
            <td>Status</td>
            <td>View</td>
         </thead>

         {% for row in rows %}
            <tr>
               <td>{{ character["user"] }}</td>
               <td>{{ character["name"] }}</td>
               <td>{{ character["race"] }}</td>
               <td>{{ character["cha_class"] }}</td>
               <td>{{ character["level"] }}</td>
               <td>{{ character["status"] }}</td>
               <td><a href={{ url_for('cha_name') }}>View Sheet</a></td> <!-- HERE -->
            </tr>
         {% endfor %}

      </table>
      <a href = "/add_char">Add a new Character</a>
      <a href = "/">Go back to home page</a>

   </body>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

我应该在 with 行中使用什么<!-- HERE -->来链接到字符表 URL?

Dra*_*rok 6

哇,这里有很多东西要打开!

\n

您的示例是无效的,例如cha_name=在调用结束时db.execute(),并且如果找到字符则不会调用render_template,因此即使有有效的请求,它也永远不会产生响应。

\n

接下来,您已经告诉 Flask 将cha_name参数传递给您的character_sheet函数,但尚未在函数本身上定义参数。

\n

最后,在您的模板中,您传递cha_nameurl_for函数,该函数(据我们从示例代码中可以看到)不是您定义的路由,因此无法工作。

\n

您需要提供更多信息以便我们提供帮助,例如告诉我们您看到的错误。现在,我想由于语法错误,Flask 服务甚至不会启动。一旦修复,我希望看到类似以下内容:

\n
werkzeug.routing.BuildError: Could not build url for endpoint \'cha_name\'. Did you mean \'character_sheet\' instead?\n
Run Code Online (Sandbox Code Playgroud)\n

我建议您返回有关 URL 构建的文档,并查看装饰器的文档route。您将在后者中看到“Flask 本身假定视图函数的名称作为端点”。这意味着为了让 Flask 为您的character_sheet函数生成 URL,您需要将该名称传递给url_for,然后传递参数,如下所示:

\n
url_for(\'character_sheet\', cha_name=character.name)\n
Run Code Online (Sandbox Code Playgroud)\n

如果用户要重命名他们的角色,所有 URL 都会改变,这是一种糟糕的用户体验 \xe2\x80\x94 如果他们为特定角色添加书签,然后修复名称中的拼写错误,会发生什么?

\n

将所有这些放在一起,这是一个希望更好的示例:

\n
werkzeug.routing.BuildError: Could not build url for endpoint \'cha_name\'. Did you mean \'character_sheet\' instead?\n
Run Code Online (Sandbox Code Playgroud)\n
<!-- templates/characters/list.html -->\n{% extends "main.html" %}\n\n{% block title %}\n    Characters\n{% endblock %}\n\n{% block main %}\n    <table>\n         {% for character in characters %}\n            <tr>\n               <td>{{ character.name }}</td>\n               <td><a href={{ url_for(\'character_sheet\', character_id=character.id) }}>View Sheet</a></td>\n            </tr>\n         {% endfor %}\n    </table>\n    <a href = "{{ url_for(\'add_char\') }}">Add a new Character</a>\n{% endblock %}\n
Run Code Online (Sandbox Code Playgroud)\n