我正在使用龙卷风来创建一个Web服务。我学习了许多处理URL的方法,但我找不到处理这个URL的方法:
Main-Dns:xxxx(port)/ {System}(这是静态的)/ {word}?q = {word}
我的代码:
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()
只有当我擦除'?'时才尝试了很多正则表达式它的工作原理
例如,对于此URL,请获取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(),它就像这样:posible:
Uri:/system/word?{last_name='Jackson_Smith'}
to get this parameters: "word" , "last_name" , "'Jackson_Smith'"
答案 0 :(得分:3)
你不想尝试捕获"?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