有没有办法在python的Tornado Web框架中更改根URL?

时间:2016-03-03 15:39:40

标签: python tornado

我有一个Tornado Web服务器,上面运行了一个应用程序,以便我去:

本地主机:8888 /

我看到了应用程序的主页。例如,当我去的时候,

  • 本地主机:8888 /静态/图像/ logo.png
  • 本地主机:8888 /约
  • 本地主机:8888 /接触
  • 等。

我也得到了那些相关物品。

我的问题是,有没有办法更改根位置,以便所有这些网址都将用以下内容替换网址的第一部分:

  • 本地主机:8888 /所有MyApplication /
  • 本地主机:8888 / MyApplication的/静态/图像/ logo.png
  • 等...

很抱歉,这是一个简单的问题!似乎无法找到答案。

请注意,我想要一个解决方案,而不是手动更改所有页面路由正则表达式以包含该前缀。

2 个答案:

答案 0 :(得分:4)

如果您使用的是tornado.web Web框架,那些根URL将作为正则表达式存储在Web应用程序对象中。所以,一个人的hacky'这项工作的方法是改变正则表达式。

假设您的网络应用程序设置为

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))

答案 1 :(得分:0)

如果您使用的是Tornado 4.5+,我认为您在monkeypatching 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