如何在龙卷风请求处理程序中访问我的 url/path 的部分内容

How do I get access to parts of my url/path in a tornado request handler

抱歉,如果这个问题看起来很基础,但我不知道如何 google 我想要什么,所以需要一些解释。

我正在为我的 server/routing 使用 tornado。这是我正在尝试做的事情。

http = tornado.web.Application([
    (r"/myroute/*", request_handlers.MyHandler, {}),
    (r"/",  request_handlers.defaultHandler, {}),
], **settings)
http.listen(port)

所以解释一下,每当调用以“/myroute/”开头的路由时,紧跟在第二个斜杠之后的任何内容都将被解释为所需的路径的第二部分。该值可以为空字符串。

一些我需要能够解析的路径示例...

"/myroute/?var1=foo&var2=bar"    ## the required portion is empty string
"/myroute/something?var1=foo"     ## the required portion is "something"
"/myroute/something"             ## same, without options

现在在我的请求处理程序中,我可以很容易地访问我的选项。

class MyHandler(tornado.web.RequestHandler):

    def get(self, *args, **kwargs):
        var1 = self.get_argument('var1')
        print var1       ## 'foo'
        var2 = self.get_argument('var2')
        print var2       ## 'bar'

基本上就是几个问题。

1) 但是,如果我们坚持使用我的示例,我将如何访问路径的 "something" 部分?

2) 是否有更好的术语来描述我正在寻找的内容?如果我只知道要搜索什么,我毫不怀疑这是 google可行的。

Tornado 允许您使用 self.request.path 访问路径。然后您可以将其拆分为路径组件。

假设您的路径是 /myroute/something

class MyHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        components = [x for x in self.request.path.split("/") if x]
        # results in ['myroute', 'something']

您可以在向应用程序添加处理程序时使用匹配项(正则表达式)指定路由:

import tornado.httpserver
import tornado.ioloop
import tornado.web


class SomeHandler(tornado.web.RequestHandler):

    def get(self, matched_part=None):
        # if route won't match we set param to None

        # different request params that my be handy for you  
        print('Host: %s' % self.request.host)
        print('Entire uri: %s' % self.request.uri)
        print('Uri path: %s' % self.request.path)
        print('Query path w/o ?: %s' % self.request.query)

        if matched_part is None:
            print('Nothing matched')
        else:
            print('Matched part %s' % matched_part)

if __name__ == "__main__":
    application = tornado.web.Application([
        # match everything, but query part, after /myroute/ e.g.
        # /myroute/ => None
        # /myroute/test => test
        # /myroute/test/aaa => test/aaa
        # /myroute/test?ss=324 => test            
        ("^\/myroute\/(.+)$", SomeHandler),
        ("/.*", SomeHandler),
    ])
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.current().start()