本文以get请求和post请求为例,讲解tornado如何获取GET,POST 请求参数,如何获取json数据并返回json数据
tornado使用get_argument方法获取get请求的参数,该方法定义如下
def get_argument( # noqa: F811
self,
name: str,
default: Union[None, str, _ArgDefaultMarker] = _ARG_DEFAULT,
strip: bool = True,
) -> Optional[str]:
pass
你可以设置default参数默认值,如果get请求没有传对应的参数则返回定义的默认值。
import tornado.ioloop
from tornado.web import RequestHandler, Application
from tornado.httpserver import HTTPServer
from tornado.options import options, define
define('port', default=8000, help='监听端口')
class HelloHandler(RequestHandler):
def get(self):
name = self.get_argument('name')
age = self.get_argument('age')
city = self.get_argument('city', default='beijing')
self.write(f'{name} is {age} years old, he comes from {city}')
if __name__ == '__main__':
options.parse_command_line()
handlers_routes = [
(r'/', HelloHandler)
]
app = Application(handlers=handlers_routes)
http_server = HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
在浏览器里请求 http://127.0.0.1:8000/?name=kwsy&age=14, 得到的结果
kwsy is 14 years old, he comes from beijing
请求里没有city参数,city取default参数所设置的值。
有时,你可能希望以一种简单的办法获取所有的请求参数,而不是有多少个参数就调用多少次get_argument方法,get请求的参数值都以字典形式存储在self.request.arguments中,你可以遍历这个字典
class HelloHandler(RequestHandler):
def get(self):
query_data = {}
for key in self.request.arguments.keys():
query_data[key] = self.get_argument(key)
self.write(query_data)
同样的请求,浏览器里显示的结果是
{"name": "kwsy", "age": "14"}
post请求,其数据格式多为form和json, 先来看form格式的post请求数据。
客户端代码:
import requests
data = {
'name': 'kwsy',
'age': 14
}
res = requests.post('http://127.0.0.1:8000', data=data)
print(res.text)
服务端代码:
class HelloHandler(RequestHandler):
def post(self):
name = self.get_argument('name')
age = self.get_argument('age')
self.write(f'{name} is {age} years old')
哎,你没看错,获取post请求的数据,也可以用get_argument,get_argument技能从get请求的query参数里获取数据,也能从post请求的body里获取数据。
实际上,get请求,和post请求都有自己专用的方法,get请求的专用方法是get_query_argument, post请求的专用方法是get_body_argument,而get_argument则是通用的。
但对于json格式的post数据,则不能使用get_argument方法,而是需要直接获取body转为json数据。客户端代码:
import requests
data = {
'name': 'kwsy',
'age': 14
}
res = requests.post('http://127.0.0.1:8000', json=data)
print(res.text)
服务端代码
import json
class HelloHandler(RequestHandler):
def post(self):
data = json.loads(self.request.body)
self.write(data)
tornado返回json数据不需要做任何处理,只需要使用self.write方法或者self.finish方法直接返回字典就可以,torando框架自己会将字典转为json数据,这一点可以从代码里找到证据
def write(self, chunk: Union[str, bytes, dict]) -> None:
# other codes
if isinstance(chunk, dict):
chunk = escape.json_encode(chunk)
self.set_header("Content-Type", "application/json; charset=UTF-8")
chunk = utf8(chunk)
QQ交流群: 211426309