0

我想学习 Trac 和 Bloodhound 的源代码。我有网络编程和一些框架的背景,尤其是 Django。但是 Trac 和 Bloodhound 与使用框架构建的传统 Web 应用程序有很大不同。

URL 调度程序如何为这些项目工作?源代码浏览器是如何工作的?

4

1 回答 1

4

在 Django 中,您有 URL 调度程序,它将请求与某些模式匹配,然后将 HttpRequest 作为第一个参数传递给关联的视图函数(请参阅django 文档)。

在 Trac 中,您有许多以类似方式匹配请求的接口。最简单的例子是 IRequestHandler ,它有两个方法,match_request()process_request()。您可以将 match_request() 视为 Django 中的 URL 模式匹配,将 process_request() 视为在关联的 match_request() 返回 True 时调用的后续视图。

有关来自 Trac 源代码的示例,请参阅 trac 如何匹配请求以查看trac/ticket/web_ui.py 中的票证

# IRequestHandler methods

def match_request(self, req):
    if req.path_info == "/newticket":
        return True
    match = re.match(r'/ticket/([0-9]+)$', req.path_info)
    if match:
        req.args['id'] = match.group(1)
        return True

def process_request(self, req):
    if 'id' in req.args:
        if req.path_info == '/newticket':
            raise TracError(_("id can't be set for a new ticket request."))
        return self._process_ticket_request(req)

    return self._process_newticket_request(req)

因此,如果您想编写一个匹配 Web 请求的插件,则必须为 IRequestHandler 接口实现一个扩展点。惯例是将与 web 相关的内容放在 web_ui.py 文件中,该文件必须定义一个新组件。我建议您阅读这个 Trac 开发页面以获取另一个示例。

在 RjOllos 链接到的图表中,您实际上可以看到每个请求都有许多接口在工作。例如,您可以在 pre_process_request() 中更改处理程序,或者在初始 match_request() 之后使用 post_process_request() 添加数据。这些是来自IRequestFilter 接口的方法。

有关在处理 Web 请求时可以调用的接口的完整列表,请参阅trac.web.api

最后一个需要注意的微妙之处是,在 Django 中你有一个request对象,但在 Trac 中你有一个req对象。它们包含相似的方法和属性,描述每个请求周围的元数据。

于 2014-03-03T13:03:06.190 回答