1

这是一个 Python/Flask 问题。

更新:我今天早上醒来时有一种不好的感觉,这是正确的。Flask 没有在源代码中创建这些怪诞的 href - 前置是在执行期间发生的。当我将鼠标悬停在链接上时,我一直在查看显示的链接地址。今天我在生成的源代码中检查了它们,它们很好 - 就像我生成它们一样。

所以现在我的问题是:当我从一个项目转移到下一个项目时,为什么运行时进程会构建某种浮动的基本 URL?如何关闭它 - 或告诉 Flask 重置到原始根应用程序目录?

= = = = =

我正在尝试生成一个包含对相关网页的引用的网页。这些页面以树状结构组织,所有项目都位于一个级别,每个项目下有多个页面。对于显示的每个页面,我想显示一个侧边栏,列出所有项目和每个项目下的所有页面,并显示每个页面的链接。

我的views.py程序设置如下:

@app.route('/')
@app.route('/abc')
@app.route('/abc/<projectName>')
@app.route('/abc/<projectName>/<pageName>')
@app.route('/<projectName>/<pageName>')
def abc_pages(projectName=None, pageName=None):
.
. [includes creating anchor tags]
.

我的问题是,当我的 URL 同时包含 projectName 和 pageName 时,我创建的锚标记会将 projectName 附加到它们前面。例如,我可以使用只有 projectName 的 URL 访问默认页面,如下所示:“example.com:5000/abc/projectA”。在该页面上,生成的锚标记与 href 一样,看起来像“example.com:5000/abc/projectB/page_b2”。

但是,如果我使用包含 projectName 和 pageName 的 URL(例如“example.com:5000/abc/projectA/page_a1”)访问一个页面,则锚点(如以前一样生成)看起来像这样:“example.com:5000 /abc/projectA/projectB/page_b2"。

经过漫长而令人沮丧的搜索,没有找到解决方案,我顺其自然,然后像这样修剪掉有问题的 projectName:

@app.route('/')
@app.route('/abc')
@app.route('/abc/<projectName>')
@app.route('/abc/<projectName>/<pageName>')
@app.route('/<projectName>/<pageName>')
@app.route('/abc/<noName>/<projectName>/<pageName>') <<--- new code here
def abc_pages(noName=None, projectName=None, pageName=None):
.
. [includes creating anchor tags]
.

没有喜悦。这只能让我解决问题的一个迭代。我可以单击格式错误的“example.com:5000/abc/projectA/projectB/page_b2”,但在 page_b2 上生成的锚标记看起来像“example.com:5000/abc/projectA/projectB/ProjectC/page_c3”。

所以我的问题是为什么生成的锚标签会在它们前面加上这个历史记录(但只有 projectName 历史记录)。我每次都为锚标记生成相同的代码,但 href 不断扩展。

4

1 回答 1

1

Flask 友好的方式来生成链接是通过使用url_for,因为这消除了你必须知道路由是如何构建的依赖。

例子:

link = url_for("abc_pages", projectName = "project_B", pageName = "page_B2")

如果您以这种方式生成链接,您无需担心,它们将始终是正确的。如果稍后您决定更改路线url_for,也会自行更新。

也就是说,您手动生成的路线存在的问题可能是您通过不以/. 不以 a 开头的链接与/浏览器地址栏中显示的 URL 相关,例如,如果您的浏览器位于 at/project_A并且您有指向project_B/page_B2浏览器的链接,则将这两个链接连接并转到/project_A/project_B/page_B2。相反,如果您将链接写为,/project_B/page_B2那么这是一个绝对 URL,因此浏览器将丢弃旧路径并将其用作新 URL。

于 2013-08-04T16:57:25.207 回答