2010-05-26 54 views
3

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

我有它的工作,但它感觉非常不稳定。它的工作原理是它采用路径(比如/ 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) 

而且使用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列表。迭代它并获取所有父母并尝试匹配它。

截至目前它只适用于一个根页面和一个子页面。 我不知道如何使它更加动态和支持多个层次。

有没有人自己写或有什么好的建议?

+0

可能重复(http://stackoverflow.com/questions/2297056/pretty-urls-in -google-app-engine-url-rewriting) – ceejayoz 2010-05-26 20:44:16

+0

不幸的是没有。我的问题是关于如何正确存储和获取数据,而不是如何获取网址。 – fredrik 2010-05-26 21:01:22

+0

这里的目标究竟是什么?如果您只是直接进行查询,那么为什么不把关键名称作为URL路径呢? – 2010-05-26 21:49:41

回答

1

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

退房,说的部分URL映射

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

这是我的请求处理器至尊=我的第一个参数,paramb =我的第二PARAM

类testPath(webapp.RequestHandler): DEF得到(自我,至尊,paramb):#通知的2个额外的参数,可以不只是自我 self.response.out.w仪式(至尊) self.response.out.write(paramb)

....#下面你看到我的 'urlMapping中' 之前映射任何要求“/测试/ /通知 “R”

application = webapp.WSGIApplication([''/ test /(。 )/(。) 'testPath) ( '/注销',LogoutHandler) ], 调试=真)

所以当我去' 的myapp。COM /测试/水果/绿色

至尊=水果 paramb =绿色

:d

1

这是你在找什么? http://code.google.com/appengine/docs/python/tools/webapp/running.html#URL_Mappings

而不是http://test.com/browse?category=book&productid=A209你可以有[谷歌应用程序引擎/ URL重写漂亮的URL] 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()