【问题标题】:How do I get access to parts of my url/path in a tornado request handler如何在龙卷风请求处理程序中访问我的部分 url/路径
【发布时间】:2016-01-06 15:21:44
【问题描述】:

对不起,如果这个问题看起来很基本,但我不知道如何用谷歌搜索我想要的东西,所以需要一些解释。

我将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) 但是,如果我们坚持我的示例,我将如何访问路径的“某事”部分?

2) 对于我正在寻找的内容,是否有更好的术语?如果我只知道要搜索什么,我毫不怀疑这是可以用谷歌搜索的。

【问题讨论】:

    标签: python parsing routing httprequest tornado


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。当我读到这篇文章时,我已经实现了 jumbopap 的响应,所以他/她最终接受了。这似乎更像是我所要求的精神,所以我很感激你留下答案。当我重构时可能会回到这个问题。
    • 如果有人对为什么“matched_pa​​rt”没有出现在龙卷风文档中感到困惑......它实际上被称为path_args
    【解决方案2】:

    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']
    

    【讨论】:

    • 谢谢你,我暂时就用这个了。你现在接受了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多