Google App Engine中的友好网址

时间:2010-05-26 20:40:22

标签: python google-app-engine friendly-url

我正在尝试在GAE和Python中构建友好的URL查找方法。有没有人这样做过?

我已经开始工作,但感觉非常不稳定。它是如何工作的,它采用路径(让我们说/ foo / bar /)并将其拆分为一个列表。获取列表中的最后一个元素并查询数据库以查找匹配项。现在有些令人头疼。

如果有一个'bar',因为可能有另一个'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)

使用firendly 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列表中最后一项匹配的所有内容。迭代它并取出所有父母并试图匹配它。

截至目前,它仅适用于一个根页面和一个子页面。 我不知道如何使它更具动态性并支持多个级别。

有人写过自己的或有任何好的建议吗?

2 个答案:

答案 0 :(得分:1)

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

查看说明网址映射的部分

这是完整的代码,但我希望你明白这个想法

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

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

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

application = webapp.WSGIApplication([                                     (r'/ test /(。)/(。)',testPath),                                     ('/ logout',LogoutHandler)                                     ]                                          调试= TRUE)

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

时 para p =果实 paramb =绿色

:d

答案 1 :(得分:1)

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

而不是http://test.com/browse?category=book&productid=A209,您可以拥有http://test.com/browse/book/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()