Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 27, 2011 07:32:44

vkg2
От:
Зарегистрирован: 2010-09-02
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyramid - Traversal

подскажите, при использовании traversal мне необходимо самому обрабатывать весь url или есть какой-нить “механизм наследования”?
допустим у нас есть урл вида: “site.ru/blog/page/10” следовательно классы для траверсала выглядят как:
Root() -> Blog() -> Page()
т.е. мне необходимо определить функцию __getitem__ в классах root,blog и pag, и в этой функции делать обработку урл, если url содержит ‘blog’ то __getitem__ возвращает класс блог и т.д.(имеется ввиду что самостоятельно делать разбор всех урл)?
может есть какой-то механизм, использование которого исключит необходимость постоянного ручного парсинга урл?



Офлайн

#2 Окт. 27, 2011 16:39:29

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Pyramid - Traversal

«постоянный ручной парсинг урл» — это что?



Офлайн

#3 Окт. 28, 2011 07:18:39

vkg2
От:
Зарегистрирован: 2010-09-02
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyramid - Traversal

Андрей Светлов
«постоянный ручной парсинг урл» — это что?
имею ввиду написание функции __getitem__



Офлайн

#4 Окт. 28, 2011 09:34:02

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Pyramid - Traversal

используйте dict — в нем __getitem__ уже есть



Офлайн

#5 Окт. 28, 2011 10:17:05

Sleepwalker
От:
Зарегистрирован: 2008-07-18
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyramid - Traversal

Может я ошибаюсь, но на сколько я помню в __getitem__ Вам не URL приходит а конкретный traverse key:

Т.е. в Вашем примере “site.ru/blog/page/10” В __getitem__ обьекта Root прийдет “blog” и ничего парсить не нужно …



Офлайн

#6 Окт. 28, 2011 11:28:14

vkg2
От:
Зарегистрирован: 2010-09-02
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyramid - Traversal

Sleepwalker
Может я ошибаюсь, но на сколько я помню в __getitem__ Вам не URL приходит а конкретный traverse key:

Т.е. в Вашем примере “site.ru/blog/page/10” В __getitem__ обьекта Root прийдет “blog” и ничего парсить не нужно …
все правильно.
я делаю так:

class Root(object):
__name__ = None
__parent__ = None

def __init__(self, request):
self.request = request

def __getitem__(self, key):
if ‘user’ == key:
return _setowner(User(self.request), key.encode(), self);
else:
raise KeyError(key)


class User(object):
__name__ = None
__parent__ = None

def __init__(self, request):
self.request = request
self.data = request

def __getitem__(self, key):
self.key = key
if ‘page’ == key:
return _setowner(Page(self.request,key), key.encode(), self);
else:
raise KeyError(key)

и т.д..

p.s. я просто интересуюсь возможностями пирамиды.



Отредактировано (Окт. 28, 2011 11:48:16)

Офлайн

#7 Окт. 31, 2011 09:25:21

Sleepwalker
От:
Зарегистрирован: 2008-07-18
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyramid - Traversal

Небольшое замечание, когда при траверсе обьект не найден,

def __getitem__(self, key):
self.key = key
if 'page' == key:
return _setowner(Page(self.request,key), key.encode(), self);
else:
raise KeyError(key)
лучше райзить pyramid.exceptions.NotFound для которого потом добавить вью с соответствующей страницей.
config.add_view(notfound_view, context=NotFound)



Отредактировано (Окт. 31, 2011 09:25:50)

Офлайн

#8 Ноя. 4, 2011 10:10:01

vkg2
От:
Зарегистрирован: 2010-09-02
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyramid - Traversal

Sleepwalker
Небольшое замечание, когда при траверсе обьект не найден,
def __getitem__(self, key):
self.key = key
if 'page' == key:
return _setowner(Page(self.request,key), key.encode(), self);
else:
raise KeyError(key)
лучше райзить pyramid.exceptions.NotFound для которого потом добавить вью с соответствующей страницей.
config.add_view(notfound_view, context=NotFound)
спасибо.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version