【发布时间】:2011-02-24 09:19:50
【问题描述】:
我正在尝试在 GAE 和 Python 中构建友好的 URL 查找方法。有人做过吗?
我已经让它工作了,但感觉很不稳定。它的工作原理是它采用路径(比如说/foo/bar/)并将其拆分为一个列表。获取列表中的最后一个元素并查询数据库以查找匹配项。现在有些头疼。
如果有多个“栏”,因为可能有另一个“栏”但在不同的页面下,如何区分它们?到目前为止,我的解决方案是遍历“bar”的结果并查看其父页面的引用属性。父 'foo' 也可能出现不止一次,所以现在我们必须对其进行迭代。不难看出,这个云很容易加起来大量的 for 循环。
更糟糕的是,一个页面可以使用一种以上的语言,并且 url 需要匹配给定的语言。
我当前的数据存储设置是这样的:
## Class to store pages.
class Pages(db.Model):
name = db.StringProperty()
## Some more properties for storing content
parentKey = db.SelfReferenceProperty()
## Class to store friendly url path segments
class UrlProvider(db.Model):
name = db.StringProperty()
path = db.StringProperty()
langCode = db.StringProperty()
page = db.ReferenceProperty(Pages)
并使用友好的 url 获取页面:
pageFromUrl = UrlProvider.gql('WHERE path = :path AND langCode = :lang', path = path, lang = templateObject.lang).fetch(100)
for pageUrl in pageFromUrl:
parentFromUrl = UrlProvider.gql('WHERE page = :page AND langCode = :lang', page = pageUrl.page.parentKey, lang = templateObject.lang).fetch(100)
for parentUrl in parentFromUrl:
if parentUrl.path == templateObject.path[-2]:
templateObject.url = parentUrl.path + '/' + path
page = pageUrl.page
它的作用是,它从 UrlProvider 获取与 templateObject.path 列表中最后一项匹配的所有内容。遍历它并获取所有父母并尝试匹配它。
到目前为止,它仅适用于一个根页面和一个子页面。 我不知道如何使它更动态并支持多个级别。
有没有人自己写过或者有什么好的建议?
【问题讨论】:
-
很遗憾没有。我的问题更多是关于如何正确存储和获取数据,而不是如何获取 url。
-
这里的目标到底是什么?如果您只是进行直接查找,为什么不将键名设为 URL 路径?
-
@Nick:你能解释一下你的意思吗?我要做的是将 URL 段映射到数据存储中的页面。由于 URL 段不是唯一的,我无法弄清楚如何在没有大量 for 循环的情况下获取属于 URL 的所有页面。
标签: python google-app-engine friendly-url