第4节,tornado如何获取GET,POST 请求的参数,如何返回json数据

本文以get请求和post请求为例,讲解tornado如何获取GET,POST 请求参数,如何获取json数据并返回json数据

1. 获取get请求参数

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"}

2. 获取post请求数据,并返回json数据

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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案