您的位置:

关于tornado的MissingArgumentError(name)

  发布时间:2023-01-28 03:30:02
报错的原因Tornado的错误通常是由于在定义路由处理函数时缺少了所需的参数导致的。需要注意的是,如果你使用了装饰器,那么在路由处理函数中应该使用self.get_argument()来获取参数,而不是在参数列表中声明。使用例子当然,下面是一个示例,该示例演示了如何在Tornado中使用路由参数,并使用self.get_argument()来获取请求中的参数在上面的示例中,路由为“/myroute/”,表示任何请求URL以“/myroute/”开头,后面跟着一个或多个字符都会被映射到MyHandler类上。

报错的原因

Tornado的MissingArgumentError(name)错误通常是由于在定义路由处理函数时缺少了所需的参数导致的。在使用@tornado.web.asynchronous装饰器或@tornado.gen.coroutine装饰器定义路由处理函数时,如果没有在函数参数中声明所需的参数,Tornado会抛出MissingArgumentError(name)错误。

如何解决

解决这个错误的方法是在定义路由处理函数时声明所需的参数。

例如,如果你需要获取URL中的一个参数,你可以在路由处理函数的参数列表中添加一个参数来接收它,如下所示:


class MyHandler(tornado.web.RequestHandler):
    def get(self, param):
        self.write("You passed in " + param)

然后在路由设置中匹配该参数,如下所示:


application = tornado.web.Application([
    (r"/myroute/([^/]+)", MyHandler),
])

如果你需要从请求中获取更多的参数,比如请求中的body或headers,你可以使用self.get_argument()或self.request.headers来获取。

需要注意的是,如果你使用了@tornado.web.asynchronous装饰器,那么在路由处理函数中应该使用self.get_argument()来获取参数,而不是在参数列表中声明。

使用例子

当然,下面是一个示例,该示例演示了如何在Tornado中使用路由参数,并使用self.get_argument()来获取请求中的参数。


import tornado.web
import tornado.ioloop

class MyHandler(tornado.web.RequestHandler):
    def get(self, param):
        extra_param = self.get_argument("extra_param", None)
        self.write("You passed in " + param + " and extra param is " + str(extra_param))

application = tornado.web.Application([
    (r"/myroute/([^/]+)/?", MyHandler),
])

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

在上面的示例中,路由为“/myroute/([^/]+)”,表示任何请求URL以“/myroute/”开头,后面跟着一个或多个字符都会被映射到MyHandler类上。在MyHandler类中,通过 self.get_argument("extra_param", None) 来获取请求中的参数。

当你在浏览器中访问http://localhost:8888/myroute/abc?extra_param=def的时候,你会看到页面上输出了"You passed in abc and extra param is def"

当然,还有其他方法来获取请求中的参数,比如使用self.request.arguments来获取所有请求参数,或使用self.request.headers来获取请求头中的信息。

例如,下面是一个使用self.request.arguments来获取请求参数的例子:


import tornado.web
import tornado.ioloop

class MyHandler(tornado.web.RequestHandler):
    def get(self):
        all_args = self.request.arguments
        self.write("All arguments: " + str(all_args))

application = tornado.web.Application([
    (r"/myroute", MyHandler),
])

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

这个例子中,当请求URL为http://localhost:8888/myroute?arg1=val1&arg2=val2时,你会在浏览器中看到页面上输出"All arguments: {'arg1': ['val1'], 'arg2': ['val2']}"

另外,如果你需要在请求处理过程中使用异步编程,你可以使用@tornado.gen.coroutine装饰器来定义路由处理函数,并使用yield来执行异步操作。

简单地说,如果你在Tornado中遇到MissingArgumentError(name)错误,那么这通常是由于在定义路由处理函数时缺少了所需的参数导致的,解决方法就是在定义路由处理函数时声明所需的参数。