请求处理

Request Processing

曾经一次 Pyramid 应用程序已启动并正在运行,可以接受请求并返回响应。从那时起发生了什么 WSGI 请求输入 Pyramid 应用到以下点: Pyramid 将响应反馈给wsgi进行上游处理?

  1. 用户从浏览器向所使用的wsgi服务器的主机名和端口号发起请求。 Pyramid 应用。

  2. 所使用的wsgi服务器 Pyramid 应用程序将wsgi环境传递到 __call__ 方法 Pyramid router 对象。

  3. A request 对象是基于wsgi环境创建的。

  4. 这个 application registry 以及 request 在最后一步中创建的对象被推送到 thread local 堆叠 Pyramid 用于允许名为 get_current_request()get_current_registry() 工作。

  5. A NewRequest event 发送给任何订户。

  6. 如果有的话 route 已在应用程序配置中定义, Pyramid router 调用A URL dispatch “路由映射器”。映射器的任务是检查请求,以确定是否有任何用户定义的 route 与当前的WSGi环境匹配。这个 router 将请求作为参数传递给映射器。

  7. 如果任何路由匹配,则路由映射器将添加属性 matchdictmatched_route 到请求对象。前者包含表示请求的匹配动态元素的字典 PATH_INFO 值,后者包含 IRoute 表示匹配的路由的对象。

  8. A BeforeTraversal event 发送给任何订户。

  9. 继续,如果任何路由匹配,将生成与找到的路由关联的根对象。如果 route configuration 匹配的具有关联的 factory 参数,则此工厂用于生成根对象;否则为默认值 root factory 使用。

    但是,如果没有匹配的路由,并且 root_factory 参数已传递给 Configurator 构造函数,该可调用项用于生成根对象。如果 root_factory 传递给配置器构造函数的参数为 None ,默认根工厂用于生成根对象。

  10. 这个 Pyramid 路由器用根对象和请求调用一个“遍历器”函数。遍历器函数尝试遍历根对象(使用任何现有的 __getitem__ 在根对象和子对象上)查找 context . 如果根对象没有 __getitem__ 方法,根本身被假定为上下文。精确的遍历算法如 遍历 . Traverser函数返回一个字典,其中包含 context 和A view name 以及其他辅助信息。

  11. 请求用从遍历器返回的各种名称(例如 contextview_name 等等),这样就可以通过,例如, request.context 在内部 view 代码。

  12. A ContextFound event 发送给任何订户。

  13. Pyramid 抬头看 view 可使用上下文、请求和视图名称调用。如果此对象组合不存在可调用视图(基于上下文类型、请求类型和视图名称的值,以及任何 predicate 应用于视图配置的属性)。 Pyramid 提高 HTTPNotFound 例外情况,这意味着被周围的人抓住 exception view .

  14. 如果找到可调用的视图, Pyramid 试图称之为。如果一个 authorization policy 正在使用,视图配置受 permissionPyramid 确定请求用户是否可以根据请求中的凭据信息和附加到上下文的安全信息执行所请求的视图可调用。如果允许执行视图, Pyramid 调用可调用视图以获取响应。如果禁止执行视图, Pyramid 提高 HTTPForbidden 例外。

  15. 如果在 root factory 通过 traversal ,由 view callable ,或 Pyramid 自身(例如当它上升时 HTTPNotFoundHTTPForbidden ,路由器捕获异常,并将其作为 exception 属性。然后它试图找到 exception view 对于捕获的异常。如果发现异常视图可调用,则调用该可调用视图,并假定生成响应。如果一个 exception view 找不到与异常匹配的,将重新引发异常。

  16. 以下步骤仅在 response 可以由正常 view callableexception view 可赎回的。 Pyramid 将尝试执行任何 response callback 附加功能通过 add_response_callback() . 一 NewResponse event 然后发送给任何订户。响应对象的 __call__ 然后使用方法生成wsgi响应。响应被发送回上游的wsgi服务器。

  17. Pyramid 将尝试执行任何 finished callback 附加功能通过 add_finished_callback() .

  18. 这个 thread local 堆栈弹出。

Pyramid Router

这是一个非常高层次的概述,遗漏了各种细节。有关 Pyramid 路由器,如遍历、URL调度、视图和事件处理,请参见 URL调度意见使用事件 .