Tornado数据响应(二)

接着上一节中的使用Tornado中返回简单的示例,本片介绍如何返回对应的json数据。常用的为get和post请求。本文以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请求没有传对应的参数则返回定义的默认值

# @File : getRequestDemo.py
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='cd')
        self.write(f'{name} is {age} years old, he come 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=zhiyu&age=28 ,界面结果展示如下:
在这里插入图片描述
控制台展示如下:
在这里插入图片描述
发现了上面的程序中,如果get请求中的查询字符串比较多,这样使用肯定不够python的,因此是否可以使用类似推导式的形式展示出来呢?当然可以,摈除了有多少个参数就调用多少次get_argument方法,get请求的参数值都以字典形式存储在self.request.arguments中,你可以遍历这个字典。

# @File : getRequestDemo.py
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='cd')
#         self.write(f'{name} is {age} years old, he come from {city}')

class HelloHandler(RequestHandler):
    def get(self):
        query_data = {}
        for key in self.request.arguments.keys():
            query_data[key] = self.get_argument(key)

        # 如果期望某些key如果没有传递参数则使用默认值,则直接判断query_city中是否有无key值
        if 'city' not in query_data:
            query_data['city'] = 'cd'

        self.write(query_data)

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()

在这里插入图片描述
这种就是类似我们平时使用的get请求查询数据,此时FE侧进行渲染即可获取想要的结果。

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

post请求中常用的数据格式为为表单formjson两种形式。

2.1. form数据格式请求

服务端代码:

# @File : postRequestDemo.py
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 post(self):
        name = self.get_argument('name')
        age = self.get_argument('age')
        city = self.get_argument('city', default='cd')
        self.write(f'{name} is {age} years old, he come 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()

客户端请求代码:

# @File : clientPostRequest.py
import requests

data = {
    'name': 'kwsy',
    'age': 14
}

res = requests.post('http://127.0.0.1:8000', data=data)
print(res.text)

运行服务请求后,运行客户端请求。输出结果如下所示:
在这里插入图片描述
在服务端请求的参数中获取post请求的数据,也可以用get_argument,get_argument技能从get请求的query参数里获取数据,也能从post请求的body里获取数据。

实际上,get请求,和post请求都有自己专用的方法,get请求的专用方法是get_query_argumentpost请求的专用方法是get_body_argument而get_argument则是通用的

2.2.json数据格式请求

但对于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)

服务端则需要使用json包

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tornado是一个Python的web框架,而Redis是一个开源的内存数据结构存储系统。它们可以一起使用来构建高性能的Web应用程序。 在Tornado中使用Redis,可以通过Redis的Python客户端库来实现与Redis服务器的交互。你可以使用这个库来连接到Redis服务器,进行数据的读取和写入操作。 首先,你需要安装Redis的Python客户端库。可以使用pip命令来安装: ``` pip install redis ``` 然后,在你的Tornado应用程序中,你可以创建一个Redis连接,通过该连接来执行各种Redis操作。下面是一个简单的示例代码: ```python import tornado.web import tornado.ioloop import redis # 创建Redis连接 r = redis.Redis(host='localhost', port=6379, db=0) # 定义Tornado请求处理器 class MainHandler(tornado.web.RequestHandler): def get(self): # 从Redis中获取数据 data = r.get('key') # 处理数据并返回响应 self.write('Data from Redis: ' + str(data)) # 创建Tornado应用程序 def make_app(): return tornado.web.Application([ (r'/', MainHandler), ]) if __name__ == '__main__': app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 在上述示例中,我们首先导入了redis库,并创建了一个Redis连接对象`r`。然后,我们定义了一个Tornado请求处理器`MainHandler`,在`get`方法中从Redis中获取数据,并将其返回给客户端。 最后,我们创建了一个Tornado应用程序,并将请求处理器映射到根URL上。通过运行应用程序并访问http://localhost:8888/,你将会看到从Redis中获取的数据。 这只是一个简单的示例,你可以根据自己的需求来使用Redis和Tornado进行更复杂的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值