Я думаю, что часть, которую вы упускаете, является частью прохождения. Продукт
ресурс? Ну, это зависит от того, что производит ваш обход, это
мог производить продукцию .....
Возможно, было бы лучше пройти сквозь это представление от
как это настраивается при создании приложения ...
Вот типичный вид.
@view_config(context=Product, permission="view")
def view_product(context, request):
pass # would do stuff
Таким образом, это представление вызывается, когда контекст является экземпляром Product. А ТАКЖЕ
если атрибут acl этого экземпляра имеет «представление»
разрешение. Так как же экземпляр Product станет контекстом?
Вот где приходит магия обхода. Сама логика
Обход - это просто словарь словарей. Итак, один способ, которым это
может работать для вас, если у вас есть URL-адрес, как
/product/1
Каким-то образом некоторые ресурсы должны быть пройдены сегментами
URL, чтобы определить контекст, чтобы можно было определить представление. Что, если
у нас было что-то вроде ...
class ProductContainer(object):
"""
container = ProductContainer()
container[1]
>>> <Product(1)>
"""
def __init__(self, request, name="product", parent=None):
self.__name__ = name
self.__parent__ = parent
self._request = request
def __getitem__(self, key):
p = db.get_product(id=key)
if not p:
raise KeyError(key)
else:
p.__acl__ = [(Allow, Everyone,"view")]
p.__name__ = key
p.__parent__ = self
return p
Теперь это описано в документации, и я пытаюсь это сварить.
вплоть до основ, которые вы должны знать. ProductContainer - это объект
который ведет себя как словарь. " имя " и " родитель "
атрибуты необходимы пирамиде для генерации URL
методы для правильной работы.
Так что теперь у нас есть ресурс, который можно просмотреть. Как мы говорим
Пирамида, чтобы пройти ProductContainer? Мы делаем это через
Конфигуратор объекта.
config = Configurator()
config.add_route(name="product",
path="/product/*traverse",
factory=ProductContainer)
config.scan()
application = config.make_wsgi_app()
Заводской параметр ожидает вызова и передает ему текущий
запрос. Так уж получилось, что ProductContainer. init сделает
это просто отлично.
Это может показаться немного большим для такого простого примера, но, надеюсь,
Вы можете представить возможности. Эта модель позволяет очень
модели гранулярного разрешения.
Если вы не хотите / нуждаетесь в очень детальной модели разрешений, такой как строка
уровень acl, вероятно, вам не нужен обход, вместо этого вы можете использовать
маршруты с одной корневой фабрикой.
class RootFactory(object):
def __init__(self, request):
self._request = request
self.__acl__ = [(Allow, Everyone, "view")] # todo: add more acls
@view_config(permission="view", route_name="orders")
def view_product(context, request):
order_id, product_id = request.matchdict["order_id"], request.matchdict["product_id"]
pass # do what you need to with the input, the security check already happened
config = Configurator(root_factory=RootFactory)
config.add_route(name="orders",
path="/order/{order_id}/products/{product_id}")
config.scan()
application = config.make_wsgi_app()
примечание: я сделал пример кода из памяти, очевидно, вам необходим весь необходимый импорт и т. Д. Другими словами, это не будет работать как копирование / вставка