Python tornado实现的简洁 resful 为前端提供数据

在这里插入图片描述

爬取的数据来源

爬取我简单使用了python 的 scrapy

main.py

import os
import platform
import tornado

from config.setting import app_port
from my_tornado.handler import _make_app

# 在window平台的兼容
def _on_window():
    if platform.system() == "Windows":
        import asyncio
        asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

# 运行中
def run():
    _on_window()
    app = _make_app()
    app.listen(app_port)
    tornado.ioloop.IOLoop.current().start()
    os.path.join(os.path.dirname(__file__),"templates")


if __name__ == "__main__":
    run()


# http://localhost:8883/random/news/?count=4
# http://localhost:8883/random/musics/?count=4
# http://localhost:8883/random/images/?count=4

setting.py


# mongo db 数据库配置信息
mongo_host = '127.0.0.1'
mongo_port = 27017
app_port = 8883

# 音乐
music_db_name = 'douban'
music_db_collection = 'music'

# 新闻
news_db_name = "yang_news"
news_db_collection = "home_news"

# 图片
image_db_name = 'images'
image_db_collection = 'music_image'

dbUtils.py

import random
import pymongo

# 数据总记录个数
from config.setting import mongo_host, mongo_port, music_db_name, music_db_collection, news_db_name, news_db_collection, \
    image_db_name, image_db_collection

# 记录记录数量
_db_data_size = 0

# 获得数据表的引用
def _get_db(db_name,db_collection):
    # 创建数据库
    client = pymongo.MongoClient(host=mongo_host, port=mongo_port)
    db = client[db_name]
    table = db[db_collection]
    # 数据记录个数
    global _db_data_size
    _db_data_size = table.find().count()
    return table

# 获取音乐
def random_musics(count):
    db = _get_db(music_db_name,music_db_collection)
    data = []
    for i in range(1, count+1):
        tmp = db.find().limit(-1).skip(random.randint(0, _db_data_size - 1)).next()
        data.append(tmp)

    return data

# 获取新闻
def random_news(count):
    db = _get_db(news_db_name,news_db_collection)
    data = []
    for i in range(1, count+1):
        tmp = db.find().limit(-1).skip(random.randint(0, _db_data_size - 1)).next()
        data.append(tmp)

    return data

# 获取图片
def random_images(count):
    db = _get_db(image_db_name,image_db_collection)
    data = []
    for i in range(1,count+1):
        tmp = db.find().limit(-1).skip(random.randint(0,_db_data_size-1)).next()
        data.append(tmp['image_url'])

    return data
   

handle.py

import json
import os
import platform

import tornado.ioloop
import tornado.web
from pymongo import settings

from utils.dbUtils import random_musics, random_news, random_images


# 错误页面
class MainHandler(tornado.web.RequestHandler):

    @tornado.gen.coroutine
    def get(self):
        self.render('../html/index.html')


# 获取音乐
class RandomMusicHandler(tornado.web.RequestHandler):
    # 一次性最大可请求的资源数目
    max_count = 100

    @tornado.gen.coroutine
    def get(self):
        arg = self.get_argument('count')
        if self.max_count < int(arg):
            self.render('../html/index.html')
            return

        # # 解析数据编程json格式
        json_str = {}
        data = []
        list = random_musics(int(arg))
        json_str['size'] = len(list)
        for i in list:
            tmp = {}
            tmp['music_url'] = i['music_url']
            tmp['music_title'] = i['music_title']
            tmp['music_size'] = i['music_size']
            tmp['music_redirect_url'] = i['music_redirect_url']
            data.append(tmp)

        json_str['content'] = data
        ans = json.dumps(json_str)
        self.write(ans)


# 获取新闻
class RandomNewsHandler(tornado.web.RequestHandler):
    # 一次性最大可请求的资源数目
    max_count = 100

    @tornado.gen.coroutine
    def get(self):
        arg = self.get_argument('count')
        if self.max_count < int(arg):
            self.render('../html/index.html')
            return

        # 解析数据编程json格式
        json_str = {}
        data = []
        list = random_news(int(arg))
        json_str['total'] = len(list)
        for i in list:
            tmp = {}
            tmp['title'] = i['title']
            tmp['url'] = i['url']
            tmp['image'] = i['image']
            tmp['image2'] = i['image2']
            tmp['keywords'] = i['keywords']
            tmp['brief'] = i['brief']
            tmp['focus_date'] = i['focus_date']
            data.append(tmp)

        json_str['data'] = data
        ans = json.dumps(json_str)
        self.write(ans)


# 获取图片
class RandomImageHandler(tornado.web.RequestHandler):
    # 一次最多请求数量
    max_count = 100

    @tornado.gen.coroutine
    def get(self):
        arg = self.get_argument('count')

        if arg is None:
            return
        if int(arg) > self.max_count:
            self.render('../html/index.html')
            return

        list = random_images(int(arg))

        json_str ={}
        json_str['total'] = len(list)
        json_str['data'] = list
        result = json.dumps(json_str)
        self.write(result)

    def write_error(self,state_code,**kwargs):
        msg = get_error_msg(False,'请求失败',state_code)
        self.write(msg)



settings = {
    "static_path": os.path.join(os.path.dirname(__file__), "static"),
}


# 错误相应信息
def get_error_msg(right,instructions,state_code):
    msg = {}
    msg['ok'] = right
    msg['instructions'] = instructions
    msg['state_code'] = state_code
    return msg

# handle设置
def _make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
        (r"/random/musics/", RandomMusicHandler),
        (r"/random/news/", RandomNewsHandler),
        (r"/random/images/", RandomImageHandler),
    ],**settings)

首先,这个resful有很多不足,特别是安全方面,今后逐渐完善,使其健壮。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python Tornado是一个用于构建高性能Web应用的异步框架。它基于事件循环和非阻塞IO的特性,可以处理大量并发连接,适用于实时应用程序和长轮询服务。在使用Tornado框架时,可以通过导入tornado.ioloop和tornado.web模块来创建应用程序。引用中的代码展示了一个简单的Tornado应用程序的快速入门示例。该示例创建了一个名为MainHandler的处理程序,当访问路径为/index时,会返回"Hello, world"。应用程序监听在8888端口上,并通过tornado.ioloop.IOLoop.instance().start()方法来启动运行。 除了快速入门示例,还可以通过引用中提供的链接来学习更多关于Python Tornado的项目实践。引用中的代码展示了一个更复杂的Tornado应用程序示例。该示例使用了自定义的模板路径和渲染页面的方式,将请求路由到MainHandler处理程序,并在访问路径为/index时渲染home/index.html页面。应用程序监听在80端口上,并通过tornado.ioloop.IOLoop.instance().start()方法来启动运行。 总而言之,Python Tornado是一个强大的异步框架,可以用于构建高性能的Web应用。通过学习快速入门示例和项目实践,可以更好地理解和使用Tornado框架。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Pythontornado](https://blog.csdn.net/banzhi8397/article/details/101392895)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [python tornado](https://download.csdn.net/download/yun12315000/10510234)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [python开发之Tornado](https://blog.csdn.net/Dr_BigJoe/article/details/105206923)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值