2

我被赋予了为 Trac 编写插件的任务。它应该为问题跟踪系统中提交的票数和估计提供燃尽数据。用户将他的请求编写为 wikimacro,并提供了一个链接/按钮,用于将燃尽图下载为 csv 文件,还计划输出为图表,但优先级较低。

我有一个处理数据的有效解决方案,但我遇到了以下问题。

我的问题

如何在 Wikipage 上为用户请求动态创建的文件提供下载链接/- 按钮?

我已经看到一些尝试在 trac 源本身和其他插件中发送文件,但由于我是网络编程的新手,这并没有真正的帮助。

Update1 我一直在尝试按照 Felix 建议的方式解决问题,这为我带来了一个新问题。这个(愚蠢的)例子应该证明我的问题。我的宏生成以下 URL 并将其添加为 wikipage 的链接。

//http://servername.com/projectname/wiki/page_name?teddy=bear    

但是 RequestHandler 没有反应,即使条件返回 true。 编辑:这段代码现在显示了示例的工作版本。

新网址:

#example url
#http://127.0.0.1:8000/prove/files/new

class CustomRequestHandlerModule(Component):
    implements(IRequestHandler)

    def match_request(self,req):
        #old, not working
        #return "teddy=bear"== str(req.path_info).split('?')[1]
        #new
        accept="/files/new"== str(req.path_info)
        return accept

    def process_request(self,req):
        csvfile = self.create_csv()
        req.send_response(200)
        req.send_header('Content-Type', 'text/csv')
        req.send_header('Content-length', len(csvfile))
        req.send_header('Content-Disposition','filename=lala.csv')
        req.end_headers()
        req.write(csvfile)
        raise RequestDone     

Update2 插入日志记录显示 match_request 永远不会被调用。

我究竟做错了什么?(是的, create_csv() 已经存在)

更新 3 Thx,为帮助 =)

4

2 回答 2

2

基本上,您需要编写自己的 IRequestHandler 来处理特定的 URL 并返回您动态创建的数据。之后,您的宏应返回为您的请求处理程序配置的 url。

于 2011-06-08T21:06:23.043 回答
2

如果match_request没有被调用,则process_request永远没有机会执行。假设您的插件没有任何问题阻止 Trac 正确加载它,那么可能发生的情况是另一个处理程序在您的版本match_request被调用之前与 URL 匹配。尝试将日志级别提高到“调试”,看看它是否提供了足够的信息来告诉谁在处理该请求。

另一种选择是为您的自动生成的文件创建一个自定义的“命名空间”。尝试将生成的 URL 中的“wiki”替换为“文件”之类的内容。这应该防止任何内置处理程序在调用插件的match_request方法之前处理请求。

于 2011-06-13T18:05:47.823 回答