Я пытаюсь создать метод поиска 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.Итерирует по нему и выбирает всех родителей и пытается сопоставить его.
На данный момент он работает только для одной корневой страницы и одной подстраницы.Я не знаю, как сделать его более динамичным и поддерживать несколько уровней.
Кто-нибудь написал свои собственные или есть хорошие предложения?