2010-05-26 3 views
3

Я пытаюсь создать удобный метод поиска URL-адресов в GAE и Python. Кто-нибудь это сделал?Дружественные URL-адреса в Google App Engine

У меня есть работа, но она очень ОЧЕНЬ шаткая. Как это работает, так это то, что он принимает путь (скажем,/foo/bar /) и разбивает его на список. Принимает последний элемент в списке и запрашивает базу данных для соответствия. Теперь наступает какая-то головная боль.

Если есть еще один «бар», так как может быть другой «бар», но под другой страницей, как рассказать друг другу? На данный момент мое решение состоит в том, чтобы перебрать результат «bar» и посмотреть на свойство ссылки на его родительскую страницу. Родительский «foo» также мог бы произойти более чем один раз, поэтому теперь мы должны перебирать это значение. Нетрудно видеть, что это облако легко складывается для большого числа циклов.

Просто, чтобы сделать его немного хуже, одна страница может быть на более чем одном языке, а 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

возможный дубликат [Довольно URL-адреса в Google App Engine/URL переписывания] (http://stackoverflow.com/questions/2297056/pretty-urls-in -google-app-engine-url-rewriting) – ceejayoz

+0

К сожалению нет. Мой вопрос о том, как правильно хранить и получать данные, а не как получить URL-адрес. – fredrik

+0

В чем же цель? Если вы просто делаете прямой поиск, почему бы просто не сделать ключевое имя URL-адресом? –

ответ

1

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

Заканчивать раздел, который говорит URL отображение

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

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

класс testPath (webapp.RequestHandler): защиту получить (я, парам, paramb): # Обратите внимание на 2 дополнительных PARAMS, а не только само self.response.out.w Обряд (парам) self.response.out.write (paramb)

.... # ниже вы видите я сопоставляюсь все, что просить «/ тест// Обратите внимание на "г" перед 'urlmapping'

application = webapp.WSGIApplication ([ (r '/ test/(. )/(.) 'testPath), ('/ выход из системы', LogoutHandler) ], отлаживать = True)

так, когда я иду в' MyApp.ком/тест/фрукты/зеленый

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

: D

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()