2016-03-03 63 views
2

我有在其上運行使得應用龍捲風的web服務器,當我去:有沒有辦法改變python的Tornado web框架中的根URL?

本地主機:8888/

我看到我的應用程序的主頁。當我去,例如,

  • 本地主機:8888 /靜態/圖像/ logo.png
  • 本地主機:8888 /約
  • 本地主機:8888 /接觸
  • 等。

我也得到那些相關的項目。

我的問題是,有沒有辦法來改變根位置,使得所有的URL會替換URL的第一部分:

  • 本地主機:8888 /爲MyApplication/
  • 本地主機: 8888 /所有MyApplication /靜態/圖像/ logo.png
  • 等...

很抱歉,如果這是一個簡單的問題!似乎無法找到答案。

請注意,我想要一個解決方案,而不是手動更改所有的頁面路由正則表達式的包括該前綴。

+0

你能提供一些代碼,你如何定義路由/處理程序?你在使用Tornado的模板嗎,你使用'static_url','reverse_url'? – kwarunek

+0

您可以閱讀[tornado.web文檔](http://www.tornadoweb.org/en/stable/web.html#tornado.web.Application)爲服務器靜態文件發送一個'static_url_prefix'。 – TaoBeier

+0

龍捲風不提供任何方式來做到這一點。但是,我可以問,手動更改網址時有什麼問題?你所要做的就是使用文本編輯器的查找/替換功能。 – xyres

回答

4

如果您使用的是tornado.web Web框架,那些根URL將作爲正則表達式存儲在Web應用程序對象中。所以,做這項工作的一種'黑客'方法是改變正則表達式。

說你的Web應用程序設置爲

my_application = tornado.web.Application([(r"/", my_handler), (r"/about", about_handler),]) 

你可以遍歷處理程序,並修改正則表達式爲他們每個人,你開始事件循環之前,就像這樣:

for handler in my_application.handlers[0][1]: 
    handler.regex = re.compile(handler.regex.pattern.replace('/', '/myApplication/', 1)) 
0

如果你使用的是Tornado 4.5+,我認爲你也有兩種選擇,可以用來修改tornado.routing.PathMatches

  1. tornado.routing.PathMatches.__init__()

    在這裏,您可以在前面加上類似r/\w*原有格局。如果您還想要將原始正則表達式模式修改爲右側開放式結尾(這是因爲original version總是確保$處於正則表達式模式的結尾處),這可能還有其他好處。這通過路徑匹配將確保路由將遵循Apache的RewriteRule或者Django的路由器式的語義(如果你需要明確匹配^$,如果您需要更具體的路徑匹配控制)

    import re 
    import tornado.routing 
    from tornado.util import basestring_type 
    
    def pathmatches_init(self, path_pattern): 
    
        if isinstance(path_pattern, basestring_type): 
    
         # restore path regex behavior to RewriteRule semantics 
    
         # if not path_pattern.endswith('$'): 
         # path_pattern += '$' 
         # self.regex = re.compile(path_pattern) 
    
         if not path_pattern.startswith('^'): 
          path_pattern = r'/\w*' + path_pattern 
    
         self.regex = re.compile(path_pattern) 
        else: 
         self.regex = path_pattern 
    
        assert len(self.regex.groupindex) in (0, self.regex.groups), \ 
         ("groups in url regexes must either be all named or all " 
         "positional: %r" % self.regex.pattern) 
    
        self._path, self._group_count = self._find_groups() 
    
    tornado.routing.PathMatches.__init__ = pathmatches_init 
    
  2. tornado.routing.PathMatches.match()

    與其說re.match()僅在路徑的開頭匹配的,re.search()被稱爲相反,因爲它會搜索匹配整個request.path,因此匹配任何URI前綴:

    import tornado.routing 
    
    def pathmatches_match(self, request): 
        # change match to search 
        match = self.regex.search(request.path) 
        if match is None: 
         return None 
        if not self.regex.groups: 
         return {} 
    
        path_args, path_kwargs = [], {} 
    
        # Pass matched groups to the handler. Since 
        # match.groups() includes both named and 
        # unnamed groups, we want to use either groups 
        # or groupdict but not both. 
        if self.regex.groupindex: 
         path_kwargs = dict(
          (str(k), _unquote_or_none(v)) 
          for (k, v) in match.groupdict().items()) 
        else: 
         path_args = [_unquote_or_none(s) for s in match.groups()] 
    
        return dict(path_args=path_args, path_kwargs=path_kwargs) 
    
    tornado.routing.PathMatches.match = pathmatches_match 
    
相關問題