2016-01-06 16 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) –