2014-03-02 65 views
0

我想學習Trac和Bloodhound源代碼。我在網絡編程和一些框架,特別是Django背景。但Trac和Bloodhound與使用框架構建的傳統Web應用程序完全不同。trac bloodhound內部結構/ url調度器

URL調度程序如何爲這些項目工作? 源代碼瀏覽器如何工作?

+0

請求處理的一些文檔可以在這裏找到(http://trac.edgewall.org/wiki/TracDev/RequestHandling)。我不能給你一個詳細的答案,但如果你不知道,可以在[TracDev](http://trac.edgewall.org/wiki/TracDev)頁面找到一些文檔。 – RjOllos

回答

4

在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對象。它們包含類似的方法和屬性,描述每個請求的元數據。

+0

謝謝...這就是我要找的 – yet