python tornado motor 异步操作mongodb

来源:互联网 发布:简谱打谱软件for mac 编辑:程序博客网 时间:2024/05/22 03:51

# -*- coding: utf-8 -*-
import logging
import logging.handlers

import motor.motor_tornado

import tornado.ioloop

import tornado
import tornado.web
import tornado.httpserver

from http_handler import ScooterNotifyHandler

from tornado.options import define, options, parse_command_line

__author__ = 'Ennis'

LISTEN_PORT=7900
define("port", default=LISTEN_PORT, help="http server listen port")

db_con = motor.motor_tornado.MotorClient("mongodb://192.168.1.205:12345")


def init_logging():
    """
    日志文件设置,每天切换一个日志文件
    :return:
    """
    logger = logging.getLogger()
    logger.setLevel(log_level)


    sh = logging.StreamHandler()
    file_log = logging.handlers.RotatingFileHandler('scooter_notify.log', maxBytes=10 * 1024 * 1024, backupCount=50)
    formatter = logging.Formatter(
        '[%(asctime)s] [%(levelname)-7s] [%(module)s:%(filename)s-%(funcName)s-%(lineno)d] %(message)s')
    sh.setFormatter(formatter)
    file_log.setFormatter(formatter)


    logger.addHandler(sh)
    logger.addHandler(file_log)


    logging.info("Current log level is : %s", logging.getLevelName(logger.getEffectiveLevel()))




def start_http_serv():
    try:
        # 装载url配置


        app = tornado.web.Application(
            handlers=[
                (r'/scooter_notify', ScooterNotifyHandler),
            ],
            db=db_con
        )


        # 配置server
        api_server = tornado.httpserver.HTTPServer(app)
        api_server.listen(options.port)
        logging.info("start scooter notify http server at: %d", options.port)
    except Exception as e:
        logging.error('Exception: %s', e)


    tornado.ioloop.IOLoop.instance().start()


if __name__ == '__main__':
    try:
        # 隐藏窗口
        whnd = ctypes.windll.kernel32.GetConsoleWindow()
        if whnd != 0:
            ctypes.windll.user32.ShowWindow(whnd, 0)
            ctypes.windll.kernel32.CloseHandle(whnd)
        # 解析参数
        parse_command_line()


        init_logging()
        start_http_serv()
    except Exception as e:
        print("start scooter notify fail: %s", e)


以下为具体操作实现,tornado的post接口实现过程,http_handler.py

# coding: utf8


from tornado.web import RequestHandler
import tornado.gen
import tornado.httpclient
import json
import logging


class ScooterNotifyHandler(RequestHandler):
    def data_received(self, chunk):
        pass


    @tornado.gen.coroutine
    def post(self):
        try:
            # 获取request 内容
            db = self.settings['db']


            req_body = self.request.body.decode()
            logging.info('req_body = [%s]', req_body)
            data_info = json.loads(req_body)

           reader_pos = yield db[DB_SG]['tReader'].find_one({'serial': reader_serial}, {'positioninfo': 1, '_id': 0})  # 查找一个,具体需根据实际数据库操作

            control_info = db[DB_SG]['tControlRule'].find({'targets': vehicle_info['vin']}, {'distance': 1})   # 多个查询操作,插入、更新与pymongo相同,需加yield
            for one_control in (yield control_info.to_list(1000)):

                  pass

                  # do one_control operate

        except Exception as e:
            msg = "ScooterNotifyHandler post api err=%s" % e
            logging.error(msg)
            msg_dict = dict()
            msg_dict['status'] = 1
            msg_dict['text'] = msg
            self.write(msg_dict)
            self.finish()

0 0