【问题标题】:Friendly URLs in Google App EngineGoogle App Engine 中的友好网址
【发布时间】: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


【解决方案1】:

这就是你要找的吗? http://code.google.com/appengine/docs/python/tools/webapp/running.html#URL_Mappings

您可以使用http://test.com/browse/book/A209 而不是http://test.com/browse?category=book&productid=A209

class BrowseHandler(webapp.RequestHandler):

def get(self, category, product_id):
    # Display product with given ID in the given category.


# Map URLs like /browse/(category)/(product_id) to BrowseHandler.
application = webapp.WSGIApplication([(r'/browse/(.*)/(.*)', BrowseHandler)
                                 ],
                                 debug=True)

def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

【讨论】:

    【解决方案2】:

    http://code.google.com/appengine/docs/python/tools/webapp/running.html#URL_Mappings

    查看说 url 映射的部分

    这是完整的代码,但我希望你能明白

    这是我的请求处理程序 parama = 我的第一个参数,paramb = 我的第二个参数

    类 testPath(webapp.RequestHandler): def get(self,parama,paramb): # 注意额外的 2 个参数,而不仅仅是 self self.response.out.write(parama) self.response.out.write(paramb)

    .... # 下面你看到我映射了任何请求 "/test// 注意 'urlmapping' 之前的 "r"

    应用程序 = webapp.WSGIApplication([ (r'/test/(.)/(.)', testPath), ('/logout', LogoutHandler) ], 调试=真)

    所以当我去'myapp.com/test/fruits/green

    parama = 水果 参数 = 绿色

    :D

    【讨论】:

      猜你喜欢
      • 2011-01-18
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多