我想學習Trac和Bloodhound源代碼。我在網絡編程和一些框架,特別是Django背景。但Trac和Bloodhound與使用框架構建的傳統Web應用程序完全不同。trac bloodhound內部結構/ url調度器
URL調度程序如何爲這些項目工作? 源代碼瀏覽器如何工作?
我想學習Trac和Bloodhound源代碼。我在網絡編程和一些框架,特別是Django背景。但Trac和Bloodhound與使用框架構建的傳統Web應用程序完全不同。trac bloodhound內部結構/ url調度器
URL調度程序如何爲這些項目工作? 源代碼瀏覽器如何工作?
在Django中,您有URL調度程序,該調度程序將請求匹配到某些模式,然後將HttpRequest作爲第一個參數傳遞給關聯的視圖函數(請參閱the django docs)。
在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文件中,這個文件必須定義一個新的Component。另外一個例子,我建議你閱讀this Trac dev page。
在RjOllos鏈接的圖中,您實際上可以看到每個請求都有多個接口工作。例如,您可以在pre_process_request()中更改處理程序,或者在使用post_process_request()初始化match_request()之後添加數據。這些是來自IRequestFilter inteface的方法。
有關處理Web請求時可以調用的接口的完整列表,請參閱trac.web.api。
需要注意的最後一個細節是,在Django中您有一個request對象,但在Trac中有一個req對象。它們包含類似的方法和屬性,描述每個請求的元數據。
謝謝...這就是我要找的 – yet
請求處理的一些文檔可以在這裏找到(http://trac.edgewall.org/wiki/TracDev/RequestHandling)。我不能給你一個詳細的答案,但如果你不知道,可以在[TracDev](http://trac.edgewall.org/wiki/TracDev)頁面找到一些文檔。 – RjOllos