2010-05-26 119 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()