Понимание ресурсов и контекста в Pyramid

Пожалуйста, поддержите меня, так как я только начинаю работать с Pyramid. У меня возникли проблемы с пониманием контекста и ресурсов в Pyramid в отношении отправки URL. Я не совсем уверен, что это означает из описания в документации, контекст и ресурс несколько круговой (для меня).

  • Что такое ресурс в пирамиде? Это просто то, что URL-адрес пытается представить? Например, если URL-адрес /organization/add_users, это ресурсная организация или пользователи?
  • Является ли контекст также организацией в приведенном выше примере?

Также,

  • Что такое объект контекста?
  • Что должен содержать объект контекста? В примере в учебнике есть только ACL, а в методе init ничего нет.

    class RootFactory(object):
    __acl__ = [(...some permissions...)]
    
    def __init__(self):
        pass
    
  • Когда возникает исключение (например, Forbidden), в какой именно момент контекст меняется?

  • Я вижу цель изменения контекста, когда возникает что-то вроде ошибки Forbidden, но когда я делаю что-то вроде проверки, почему я должен генерировать исключение, зарегистрированное с другим view_callable, которое отображает другой шаблон, когда я могу просто визуализировать в другой шаблон в пределах одного и того же view_callable вместо того, чтобы генерировать исключение? (Я видел пример ошибки проверки для add_view в документации)


person sasker    schedule 15.06.2011    source источник


Ответы (2)


Прежде всего, основная причина, по которой вы хотели бы позаботиться об этом при использовании отправки URL-адресов, заключается в использовании системы аутентификации пирамиды. Если вас это не волнует, вы можете полностью игнорировать контексты и деревья ресурсов и продолжать диспетчеризацию.

Деревья ресурсов

Пирамида имеет уникальную концепцию дерева ресурсов, которое буквально представляет собой дерево объектов, сопоставленное с путем. Это дерево проходится от корня до конца заданного пути. Во время обхода, если путь исчерпан или дерево сталкивается с конечным узлом, этот объект в дереве теперь является context.

В URL Dispatch обход не происходит (по умолчанию), поэтому контекст всегда будет корнем вашего дерева ресурсов.

В общем, вы можете использовать контекст для чего угодно в своем приложении. Он явно используется ACLAuthorizationPolicy для определения разрешений. Это целая тема, и я предлагаю ознакомиться с моей демонстрацией, в которой объясняется, как использовать систему аутентификации Pyramid с отправкой URL [1. ].

Исключения

Обработка исключений в Pyramid осуществляется двумя разными способами:

  1. Вы можете использовать try: except: в своем представлении, чтобы вернуть другой ответ.
  2. Вы можете использовать представления исключений для более общей обработки исключений в вашем приложении.

Обратите внимание, что второй способ необходим для рендеринга 404 страниц, а если вы используете аутентификацию Pyramid, то и запрещенных страниц. Это связано с тем, что Pyramid внутренне генерирует исключения NotFound и Forbidden, которые вы должны перехватывать и отображать, если хотите их настроить.

Когда возникает исключение и существует зарегистрированное представление исключения, соответствующее этому типу, Pyramid вызовет представление исключения и передаст исключение в качестве нового контекста, поэтому контекст изменится.

Я не уверен, что проверка является хорошим примером представления исключений. Чаще представления используются для случаев ошибок или для сокращения выполнения в частях вашего приложения, не связанных с представлениями. Например, вы можете захотеть обрабатывать и возвращать разные страницы, когда вашему представлению не удается подключиться к вашей базе данных или когда вы хотите вернуть ответ 4xx или 5xx. По умолчанию, если исключение не обрабатывается, сервер WSGI просто превращает его в общую страницу 500. Представления исключений позволяют настраивать это поведение.

Важным выводом из всего этого является то, что все это необязательно. Если вы запутались, не волнуйтесь, потому что вы можете использовать Pyramid без этих вещей, и когда вы освоитесь, вы сможете начать включать их в свое приложение.

person Michael Merickel    schedule 16.06.2011

Не помогает пример здесь: http://docs.pylonsproject.org/projects/pyramid/1.1/tutorials/wiki2/authorization.html#adding-login-and-logout-views неверен.

Выброшенное исключение (по крайней мере, в том, что касается пирамиды 1.0-2) — это pyramid.exceptions.Forbidden; не пирамида примера.httpexceptions.HTTPForbidden .

Однако, столкнувшись с этой загвоздкой в ​​​​учебнике, я узнал, где находятся некоторые другие полезные вещи.

person Michael J. Evans    schedule 01.07.2011
comment
Это также не помогает, когда в учебнике используются фиктивные пользователи/группы. В конечном счете кажется, что вам также нужно немного пройтись, как показано в приведенном выше примере. Мне бы очень хотелось, чтобы в учебнике действительно были показаны authn и authz с более подробным примером для начинающих пользователей в учебнике или кулинарной книге. Некоторые люди могут не согласиться, но тем не менее, мне было довольно трудно понять авторизацию и авторизацию пирамиды как новичку, и какое-то время у меня возник соблазн не использовать пирамиду просто потому, что я не мог двигаться вперед. - person sasker; 06.07.2011