Tornado URL与问号("?")不匹配

2 投票
1 回答
1051 浏览
提问于 2025-04-18 04:55

我正在使用Tornado来创建一个网络服务。我学习了很多处理网址的方法,但找不到处理以下网址的方法:

主DNS:xxxx(端口)/{系统}(这是固定的)/{单词}?q={单词}

我的代码:

 import tornado.ioloop 
 import tornado.web
 import psycopg2
 import json
 import collections
 import datetime
 import decimal


 application = tornado.web.Application([

 (r"/system/(\w+)[?][q]=[\w+]",MainHandler),

 ])

 if __name__ == "__main__":
     application.listen(8888)
     tornado.ioloop.IOLoop.instance().start()

我尝试了很多正则表达式,只有在去掉'?'的时候才有效。

例如,对于这个网址获取URI:

uri:/system/4?q=
handler:r"/system/(\d)[?]q=",MainHandler

uri:/system/word_word?q=
handler:r"/system/(\w+)[?][q]=",MainHandler

这个参数是可选的,我只是加上"()"来测试发送参数。

我使用了Python的正则表达式测试网站,发现它可以工作,但在Tornado中我觉得情况不一样。

提前谢谢你。

编辑:更多示例

   Handle:/system/(\w+)[?]q=(\w+)
   URL examples : /system/(any_word)?q=(any_word) like
                  /system/word_word?q=word
                  /system/wo5d_w5rd?q=w5ord    

编辑:这是控制台输出:

             WARNING:tornado.access:404  GET/system/test?q=test

我可以不使用'?',但我需要在有'?'的情况下处理。

编辑:使用get_argument()方法,可能是这样的:

       Uri:/system/word?{last_name='Jackson_Smith'}  
       to get this parameters: "word" , "last_name" , "'Jackson_Smith'"

1 个回答

4

你不需要在正则表达式里去捕捉 "?q=.." 这个部分。你可以在 RequestHandler 里直接处理这个,用 get_argument 方法就可以了。

下面是一个小例子,我觉得能帮你理解你想做的事情:

#!/usr/bin/python

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self, word=None):
        self.write("word is %s\n" % word)
        self.write("uri is %s\n" % self.request.uri)
        self.write("q is %s\n" % self.get_argument("q"))


application = tornado.web.Application([

(r"/system/(.+)",MainHandler),

])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

这是一个示例输出:

dan@dan:~$ curl localhost:8888/system/4?q=44d
word is 4
uri is /system/4?q=44d
q is 44d
dan@dan:~$ curl localhost:8888/system/word_word?q=word
word is word_word
uri is /system/word_word?q=word
q is word
dan@dan:~$ curl localhost:8888/system/wo5d_w5rd?q=w5ord
word is wo5d_w5rd
uri is /system/wo5d_w5rd?q=w5ord
q is w5ord

撰写回答