2016-01-06 17 views
1

对不起,如果这个问题看起来很基本,但我不知道如何为我想要的谷歌,所以需要一些解释。如何在龙卷风请求处理程序中访问我的url /路径的部分

我为我的服务器/路由使用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)有什么更好的术语我在找什么?如果我只知道要搜索什么,我毫不怀疑这是可以通过Google搜索的。

回答

2

龙卷风可让您使用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'] 
+0

谢谢你,我结束了这个打算暂且。你现在接受 – Zack

2

您可以指定匹配(正则表达式)路由时添加处理程序申请:

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

感谢您的回复。在阅读本文时,我已经实施了jumbopap的回应,所以他/她最终接受了这个接受。这似乎更多的是我所问的精神,所以我很感激你离开答案。当我重构时可能会回到这个。 – Zack

+0

如果有人对龙卷风文档中没有出现“matched_pa​​rt”的原因感到困惑......它实际上称为[path_args](http://www.tornadoweb.org/en/stable/web.html#tornado.web .RequestHandler.path_args) –