【问题标题】:Controlling URL sequence in Flask application在 Flask 应用程序中控制 URL 序列
【发布时间】:2013-08-03 22:05:37
【问题描述】:

这是一个 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"。

经过漫长而令人沮丧的搜索没有找到解决方案,我顺其自然,然后像这样删除有问题的项目名称:

@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 不断扩展。

【问题讨论】:

  • 你使用url_for来生成你的链接吗?
  • @Miguel - 不,我没有使用 url_for()。我试图让我的工作尽可能简单。不过,有问题的代码不是“纯”Flask。我只是从项目的早期版本中移植了一些 Python,而不是使用模板。并查看我上面的问题的更新。不再是代码生成问题 - 现在是运行时问题。

标签: python url flask


【解决方案1】:

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

例子:

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

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

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

【讨论】:

  • 非常感谢,米格尔。这对于理清我对流程的理解大有帮助。
猜你喜欢
  • 2016-10-15
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
相关资源
最近更新 更多