我正在尝试在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列表中最后一项匹配的所有内容。迭代它并取出所有父母并试图匹配它。
截至目前,它仅适用于一个根页面和一个子页面。 我不知道如何使它更具动态性并支持多个级别。
有人写过自己的或有任何好的建议吗?
答案 0 :(得分:1)
http://code.google.com/appengine/docs/python/tools/webapp/running.html#URL_Mappings
查看说明网址映射的部分
这是完整的代码,但我希望你明白这个想法
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()