tornado解析Post请求的json请求报文

本文介绍如何在Tornado框架中处理POST请求,并强调使用`json.loads(self.request.body)`来正确解析JSON请求报文,而非通过`self.get_arguments('xxx')`来获取JSON数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tornado解析Post请求的json请求报文
注意这一句:
data = json.loads(self.request.body) #经验证只有这样,才能正确解析
self.get_arguments(‘xxx’) 不能直接获取json数据

# coding: utf-8
"""
version: v2
update: 2016-11-21 by arron
comments: async handle
"""
# one job contains many tasks.
import os
import sys
import logging
import tornado
import tornado.ioloop
import tornado.web
import tornado.httpserver
import tornado.gen
from tornado.concurrent import run_on_executor
from tornado.escape import json_decode
# 这个并发库在python3自带在python2需要安装sudo pip install futures
from concurrent.futures import ThreadPoolExecutor
import time
import json
import crypt


LISTEN_PORT     = 8088
PROCESS_NUM     = 1
TOP_PATH        = "/dev/shm"
LOG_FILENAME     = "{script_name}.log".format(script_name=sys.argv[0].rstrip('.py'))
SALT            = 'itcac'


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        say_hi = "Hello, I am Cacti. <p>Can I help you?<p>\n"
        self.write(say_hi)

class UpdateHandler(tornado.web.RequestHandler):
    def get(self):
        self.handle()
    
    def post(self):
        self.handle()
    def handle(self):      
        try:
            logging.info(self.request.body)
            clientIP    = self.get_argument('ip')
            self.write('1')
        except Exception,e:
            logging.error("%s" % str(e))
            self.write('2')
   
class TaskHandler(tornado.web.RequestHandler):
    executor = ThreadPoolExecutor(300)
    @tornado.web.asynchronous
    @tornado.gen.coroutine
    def get(self):
        # 假如你执行的异步会返回值被继续调用可以这样(只是为了演示),否则直接yield就行
        res = yield self.handle()
        self.write(res)
        #self.finish()
        #self.handle()

    @tornado.gen.coroutine    
    def post(self):
        # 假如你执行的异步会返回值被继续调用可以这样(只是为了演示),否则直接yield就行
        res = yield self.handle()
        self.write(res)
        #self.finish()
        #self.handle()

    @run_on_executor 
    def handle(self):      
        resp = ''
        try:
            logging.error(self.request.body)
            data = json.loads(self.request.body)
            logging.error("%s, %s" % (type(data), data))
            token = data['token']
            result = {}
            result['userid'] = '15810923357'
            result['token'] = token
            result['cid'] = 85492
            result['a'] = 'test'
            resp = json.dumps(result)
        except Exception, e:
            logging.error("%s" % str(e)+" "+str(self.request.remote_ip))
            resp = json.dumps({"code":"2","msg":str(e)})
        finally:
            return resp
        

settings = {
    "static_path": os.path.join(os.path.dirname(__file__), "static"),
    #"cookie_secret": "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
    #"login_url": "/login",
    #"xsrf_cookies": True,
}

application = tornado.web.Application([
    (r"/",                 MainHandler),
    (r"/md5json",             TaskHandler),   
    (r"/update",             UpdateHandler),   
], **settings)

if __name__ == "__main__":  
    reload(sys)  
    sys.setdefaultencoding('utf8')   
    
    #logging.basicConfig(filename=config.LOG_FILENAME, level=logging.INFO)
    rotate_handler = logging.handlers.TimedRotatingFileHandler(LOG_FILENAME, 'D', 1, 0)
    rotate_handler.suffix = "%Y%m%d%H"
    str_format = '%(asctime)s %(levelname)s %(module)s.%(funcName)s Line.%(lineno)d: %(message)s'    
    log_format = logging.Formatter(str_format)  
    rotate_handler.setFormatter(log_format)
    logging.getLogger().addHandler(rotate_handler)
    logging.getLogger().setLevel(logging.ERROR)        
    
    #application.listen(config.LISTEN_PORT)
    #tornado.ioloop.IOLoop.instance().start()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.bind(LISTEN_PORT)
    http_server.start(PROCESS_NUM)
    tornado.ioloop.IOLoop.instance().start()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值