这是一个Python / Flask问题。
更新:我今天早上醒来时带着不好的感觉,这是正确的。 Flask没有在源代码中创建这些怪诞的hrefs - 在执行期间正在进行前置。我一直在查看我在链接上显示的链接地址。今天我在生成的源代码中检查了它们,它们很好 - 就像我生成它们一样。
所以现在我的问题是:当我从一个项目移动到下一个项目时,为什么运行时进程会构建某种浮动基本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”)访问页面,则锚点(如前所示生成)如下所示:“示例。 COM:5000 / ABC /了projectA /项目B / 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不断扩展。
答案 0 :(得分:1)
Flask友好的生成链接的方法是使用url_for,因为这样可以消除你必须知道如何构建路径的依赖性。
示例:
link = url_for("abc_pages", projectName = "project_B", pageName = "page_B2")
如果您以这种方式生成链接,则无需担心,它们始终是正确的。如果您稍后决定对路线进行更改,url_for
也会自行更新。
也就是说,你手动生成的路线存在的问题很可能就是你没有用/
来启动它们。不以/
开头的链接与浏览器地址栏中显示的网址相关,例如,如果您的浏览器位于/project_A
并且您有{{1}的链接浏览器将连接这两个并转到project_B/page_B2
。相反,如果您将链接写为/project_A/project_B/page_B2
,那么这是一个绝对URL,因此浏览器将抛弃旧路径并将此路径用作新URL。