POST 在 Tornado 中使用多个参数进行查询

POST query in Tornado with multiple parameters

代码:

class Telegram(tornado.web.RequestHandler):
    def my_f(self,number):
        return number


    def get(self,number):
        self.write( self.my_f(number))

application = tornado.web.Application([
    (r"/number/(.*?)", Telegram),
    ])

使用这段代码,我可以触发 Telegram,为它提供 (.*?) 部分的内容。

问题是:我需要进行 POST 查询,例如: /number/messenger=电报&phone=3332223332211

这样我就可以获取 messenger 参数和 phone 参数,并使用提供的 phone 号码触发正确的 class(就像 Telegram 的 3332223332211)

POST 请求(通常)有一个正文,所以如果您想要 URL 中的所有内容,您可能需要 GET 而不是 POST.

传递参数的正常方法是对它们进行形式编码。它以 ? 开头,看起来像这样:/number?messenger=telegram&phone=12345。要在 Tornado 中使用这样的参数,您可以使用 self.get_argument("messenger") 而不是 get() 方法的参数。

第二种传递参数的方式是将它们放在URL的"path"部分,不带问号。这是当您在路由模式中使用 (.*?)get() 的参数时。当您出于某种原因(通常是美观)想要避免问号时使用此选项。

您也可以将两者结合起来:像您在此处所做的那样在 URL 中传递 messenger 参数,然后添加 ?number=12345 并使用 get_argument。但是除非你真的关心你的 URL 长什么样,否则我推荐第一种形式。