Дружественные URL в Google App Engine - PullRequest
3 голосов
/ 27 мая 2010

Я пытаюсь создать метод поиска Friendly URL в GAE и Python.Кто-нибудь делал это?

У меня это работает, но это ОЧЕНЬ шатко.Как это работает, так это то, что он берет путь (скажем / 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.Итерирует по нему и выбирает всех родителей и пытается сопоставить его.

На данный момент он работает только для одной корневой страницы и одной подстраницы.Я не знаю, как сделать его более динамичным и поддерживать несколько уровней.

Кто-нибудь написал свои собственные или есть хорошие предложения?

Ответы [ 2 ]

1 голос
/ 22 августа 2011

Это то, что вы ищете? 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()
1 голос
/ 06 декабря 2010

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

Ознакомьтесь с разделом, в котором написано отображение URL

это полный код, но я надеюсь, что вы поняли

это мой обработчик запросов parama = мой первый параметр, paramb = мой второй параметр

class testPath (webapp.RequestHandler): def get (self, parama, paramb): # обратите внимание на 2 дополнительных параметра, а не только на себя self.response.out.write (парам) self.response.out.write (paramb)

.... # ниже вы видите, что я отобразил все, что запрашивает "/ test / / обратите внимание на" r "перед" urlmapping "

application = webapp.WSGIApplication ([ (r '/ test /(.) / (. )', testPath), ('/ logout', LogoutHandler) ], отлаживать = True)

поэтому, когда я иду на myapp.com/test/fruits/green

парама = фрукт paramb = зеленый

: D

...