【问题标题】:Tornado Url Not Match with ? ("Interrogation") SignTornado URL 不匹配? (“审讯”)标志
【发布时间】:2014-04-30 18:10:33
【问题描述】:

我正在使用 tornado 创建 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 regex tester web,发现我可以工作,但在 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'"

【问题讨论】:

  • 您能否展示一些 URL 示例和预期输出?
  • >一些例子 >handle:/system/(\w+)[?]q=(\w+) >url:/system/word_word?q=word , /system/word_4d?q=44d

标签: python regex tornado


【解决方案1】:

您不想尝试在正则表达式中捕获“?q=..”。您可以使用get_argument 方法在RequestHandler 本身中捕获它。

这是一个小例子,我认为它可以捕捉到您正在尝试做的事情:

#!/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

【讨论】:

  • 是的,我想捕获其他参数,但是我得到 http:404 错误,因为每当我放 '?' 时出现龙卷风处理程序无法匹配 Uri。
  • 您能否提供一个我的示例代码无法处理的 URI?
  • 我怎样才能使用这样的 URL 方法:/system/word_word?q={last_name:'Jackson_Smith'},我喜欢捕获“word_word”、“last_name”和“'Jackson_Smith ’”。没有“”
  • 如果您要尝试发送 JSON,您可能需要在正文中使用带有 JSON 的 POST 请求,而不是 GET。我提供的代码可以处理该请求,但是您会丢失大括号。它最终会收到这个q is last_name:'Jackson_Smith'。这是因为这就是 Tornado 在 uri 本身中的最终结果:uri is /system/word_word?q=last_name:'Jackson_Smith'
  • 好的,谢谢你的帮助,我会尝试用另一种方式来做。
猜你喜欢
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
相关资源
最近更新 更多