【问题标题】:How do I prevent Jinja links from nesting?如何防止 Jinja 链接嵌套?
【发布时间】:2023-02-14 05:03:54
【问题描述】:

我有一个 FastAPI 应用程序,它采用任何端点 foo/{page} 并使用 page 变量来决定要呈现的模板。

它看起来有点像这样:

@api_router.get("/foo/{page}/")
def foo_router(page: str, request: Request):
    return TEMPLATES.TemplateResponse(
            f"{page}.html",
            {
                "request": request,
                'page_title':page,
                'schema':schema[page],
            }
        )

这些模板包含的按钮是从一个模式创建的,该模式将按钮文本和链接目标作为键/值对。

是这样的:

schema = {
    "index": {
        "Look At Our Menu":"foo/menu",
        "Find Our Store":"foo/location",
    }
}

Jinja 模板如下所示:

<div class="form_wrapper">
{% for k in buttons %}
    <a href="foo/{{buttons[k]}}/">
    <div class="button_text full_button">
    {{ k.upper() }}
    </div>
    </a>
{% endfor %}
</div>

我的问题是,如果我在foo/menu/ 中有一个我想指向foo/drinks 的链接,它会尝试加载foo/menu/foo/drinks。如何重置路径使其不嵌套?

【问题讨论】:

  • 这似乎更多地是关于 HTML 而不是关于 Jinja。如果您有一个页面/foo/menu,并且您想要从该页面上的链接链接到/foo/drinks,那么相对链接将是&lt;a href="drinks"&gt;Drinks&lt;/a&gt;
  • 对 - 问题是知道读取路径的端点是foo/{bar}drinks的链接将转到/drinks而不是foo/drinks(实际上我认为我设置它的方式会转到foo/menu/drinks——同样的问题)无论如何我在下面想出了一些办法
  • 你可能想在让模板模块读取它之前对该字符串进行大量清理,我想?
  • @MatsLindh 说更多?
  • @steadynappin 不要使用用户控制的值直接加载模板,而是确保它首先映射您的期望值之一,以避免用户加载您不希望他们能够执行的随机模板。

标签: python jinja2 fastapi


【解决方案1】:

好的,我想通了,使用request 来获取基本路径

<div class="form_wrapper">
{% for k in buttons %}
    <a href="{{ request.base_url.url + 'foo/' + buttons[k] }}/">
    <div class="button_text full_button">
    {{ k.upper() }}
    </div>
    </a>
{% endfor %}
</div>

我不确定这是最好的方法,但到目前为止它确实有效!


【讨论】:

  • 由于您想要页面端点的 URL,{{ url_for('foo_router', page=buttons[k]) }} 不会做正确的事情吗?
  • 这有效并且更清洁!谢谢!
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多