Tornado URL与问号("?")不匹配
我正在使用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