2016-03-03 32 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 
    
相关问题