首先,为什么选择Tornado:1.高性能的网络库,这可以和gevent,twisted,libevent等做对。

提供了异步io支持,超时事件处理,在此基础上提供了tcpserver,httpclient,尤其是curlhttpclient,

在现有http客户端中肯定排第一。可以用来做爬虫,游戏服务器,据我所知业界已有使用tornado作为游戏服务器

2.web框架,这可以和django,flask对。

提供了路由,模板等web框架必备组件。与其他区别是tornado是异步的,天然适合长轮训,

这也是friendfeed发明tornado的原因,当前flask也可以支持,但必须借助gevent等

3.较为完备的http服务器,这点可以和nginx,apache对比,

但只支持http1.0,所以使用nginx做前段不仅是为了更好利用多核,也是让其支持http1.1

4.完备的wsgi服务器,这可以和gunicore,gevent wsgi server做对比,

也就是说可以让flask运行在tornado之上,让tornado加速flask

5.提供了完备的websocket支持,这让html5的游戏等提供了便利。

像知乎长轮训就是使用了websocket,但websocket手机支持的不是很好,

前段时间不得不使用定时ajax发送大量请求,期待手机浏览器赶快奋起直追

使用tornado创建一个简单的图书介绍页好了,言归正传,下面我们来看一下这个图书介绍页的代码实现:

1.创建一个web服务的入口文件 blockmain.py

#coding:utf-8

import tornado.web

import tornado.httpserver

import tornado.ioloop

import tornado.options

import os.path

import json

import urllib2

from tornado.options import define, options

define("port", default=8000, help="run on the given port", type=int)

class MainHandler(tornado.web.RequestHandler):

def get(self):

self.render(

"index.html",

page_title = "Burt's Books ¦ Home",

header_text = "Welcome to Burt's Books!",

books = ['细说php','python','PHP','小时代']

)

class HelloModule(tornado.web.UIModule):

def render(self):

return'

I am yyx and this is an information from module hello!

'

class BookModule(tornado.web.UIModule):

def render(self,bookname):

doubanapi = r'https://api.douban.com/v2/book/'

searchapi = r'https://api.douban.com/v2/book/search?q='

searchurl = searchapi+bookname

searchresult = urllib2.urlopen(searchurl).read()

bookid = json.loads(searchresult)['books'][0]['id']

bookurl = doubanapi+bookid

injson = urllib2.urlopen(bookurl).read()

bookinfo = json.loads(injson)

return self.render_string('modules/book.html',book = bookinfo)

def embedded_javascript(self):

return "document.write(\"hi!\")"

def embedded_css(self):

return '''.book {background-color:#F5F5F5}

.book_body{color:red}

'''

def html_body(self):

return ''

if __name__ == "__main__":

tornado.options.parse_command_line()

app = tornado.web.Application(

handlers = [

(r'/',MainHandler),

],

template_path = os.path.join(os.path.dirname(__file__),'templates'),

static_path = os.path.join(os.path.dirname(__file__),'static'),

debug = True,

ui_modules={'Hello':HelloModule,'Book':BookModule}

)

http_server = tornado.httpserver.HTTPServer(app)

http_server.listen(options.port)

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

说明一下,一些基本的MVC概念:

tornado也是通过pathinfo模式来匹配用户的输入来获得参数,然后再调用相应的处理函数,它是通过为各种匹配模式设定相应的class类来处理,比如我这里就是通过class MainHandler来处理来自/的get请求

MainHandler把请求render渲染到index.html,参数在index.html中通过{{参数}}来调用

2.建立相应的模板,先创建一个基础的父类main.html模板,创建templates目录,在它下面创建main.html,这个模板只是定义了最基础的网页框架,里面的具体内容由继承于它的子类来具体实现

{{ page_title }}

{% block header %}

Burt's Books

{% end %}

{% block body %}{% end %}

{% set mailLink = 'Contact Us' %}

{% set script = '' %}

{% block footer %}

For more information about our selection, hours or events, please email us at{% raw mailLink %}

{% end %}

这里是定义了一个主框架,其中里面的{% block header %}

Burt's Books

{% end %}是为了子类模板的继承的块(block),当子类继承了这个main.html,具体这个块里写什么内容由子类来实现,不实现的话就使用父类的默认 值,如是这里的

Burt's Books

,MainHandler类是render到一个index.html,那么接下来写一个index.html来继承这 个父类

{% extends "main.html" %}

{% block header %}

{{ header_text }}

{% end %}

{% block body %}

Welcome to Burt's Books!

{% module Hello() %}

{% for book in books %}

{% module Book(book) %}

{% end %}

...

{% end %}

简单简洁吧,这也是使用了继承的好处,不用再重复写父类的东西,只要实现父类的block内容即可

MainHandler类里的render方法中的参数

page_title = "Burt's Books | Home",

header_text = "Welcome to Burt's Books!",

books = ['细说php','python','PHP','小时代']

将会通过参数传送到这里来

tornado的模板里可以使用python的代码,加上{% %}当使用if for while等要使用{% end %}结尾

代码中{% module Book(book) %} 将会调用入口服务文件中的定义和'Book'所对应的模块

ui_modules={'Hello':HelloModule,'Book':BookModule} 也就是BookModule,查看上面的BookModule定义

class BookModule(tornado.web.UIModule):

def render(self,bookname):

doubanapi = r'https://api.douban.com/v2/book/'

searchapi = r'https://api.douban.com/v2/book/search?q='

searchurl = searchapi+bookname

searchresult = urllib2.urlopen(searchurl).read()

bookid = json.loads(searchresult)['books'][0]['id']

bookurl = doubanapi+bookid

injson = urllib2.urlopen(bookurl).read()

bookinfo = json.loads(injson)

return self.render_string('modules/book.html',book = bookinfo)

BookModule 继承自tornado.web.UIModule,UI模块的使用是最后render_string()方法来把一个对象渲染到一个模板中去,我这里简单 的使用了豆瓣的图书api,先通过search来查询一下包含关键词的图书信息,返回第一条图书的id,再使用book api来查询该图书的具体信息,将这个具体图书的信息render到对应的模板

在templates 目录下创建modules目录,再下创建一个book.html,这里是具体的book要显示的内容框架

{{ book["title"] }}

点击查看详情

{% if book["subtitle"] != "" %}

{{ book["subtitle"] }}

{% end %}

Released: {{ book["pubdate"]}}
Description:
{% raw book["summary"] %}

最后的文件目录结构应该是这样的

├── blockmain.py

└── templates

├── index.html

├── main.html

└── modules

└── book.html

程序的执行是这样的:

先通过路径‘/'来使用MainHandler类访问index.html---->index.html继承自 main.html---->index.html中的{% module Book(book) %}反过来查找blockmain.py中的Book对应的ui_modules---->ui_modules中将查询得到的book对象内容渲 染到modules下的book.html中,这样就把完整的内容呈现出来了,没有做前端…… 通过python blockmain.py启动服务,通过http://localhost:8000 来访问得到如下的网页

python开发h5页面_使用Python的Tornado框架实现一个Web端图书展示页面相关推荐

  1. python开发公司网站_用python开发网站

    我也不说其它的固定链接的方法,因为那样的教程网上一搜就一大把,我也就只说下我所遇到的问题.固定链接对于搜索引擎很友好,这都是大家知道的,前几天在装好WordPress程序后,想设置下固定链接,结果就遇 ...

  2. python开发每月工资_做python开发想要月薪20K不会这些怎么行?

    Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理 ...

  3. python开发好吗_用Python开发应用好用吗?

    为什么用Python开发桌面应用程序 1)wxWidgets是一个比MFC优雅的库,TortoiseCVS用wxWidges而不用MFC,就是因为wxWidgets好用,而不是为了可以移植. 2)Py ...

  4. python开发师工资_【Python开发工程师工资|Python开发工程师待遇怎么样】-看准网...

    定制个人薪酬报告Python开发工程师工资水平(元/月-税前) ¥10515 职位平均工资 你认为这个数据靠谱吗? 靠谱 1太低 2太高 0 Python开发工程师工资详情 该职位在0-5k薪资范围占 ...

  5. python开发游戏引擎_用Python写3A?Cygames的游戏引擎做得怎么样

    有句话叫"二流的游戏公司做游戏,一流的游戏公司做平台".索尼.任天堂.微软这些主机公司,除了推出第一方游戏以外,当然也在维护自家的游戏系统. 其实,以<公主连结RE:Dive ...

  6. python开发笔记软件_图解Python编程神器Jupyter Notebook

    大家好!在本门课程中我会给大家详细讲解鼎鼎大名的Python编程神器Jupyter Notebook.Jupyter Notebook看似简单,实际上功能非常强大,而且有很多实用的小技巧.遗憾的是,目 ...

  7. python开发大型游戏_用Python做大型游戏合适吗?

    首先来说Python用于大型游戏,分四种情况:客户端,引擎和基本框架层面,毫无希望. 客户端,逻辑层,Python没问题.很擅长,但性能方面不是Lua的对手. 服务器,框架层,特别适用于某些交互不频繁 ...

  8. python开发项目管理平台_基于Python的软件项目管理系统.doc

    摘要:软件项目管理系统是为了使软件能按照预定的进度和质量顺利完成,而针对开发人员进行管理的系统,目的是使开发人员通力合作,相互配合,以低成本完成目标.系统包括项目开发人员基本信息管理.软件进度查看和软 ...

  9. python开发sqlite3完整_让Python更加充分的使用Sqlite3-阿里云开发者社区

    我最近在涉及大量数据处理的项目中频繁使用 sqlite3.我最初的尝试根本不涉及任何数据库,所有的数据都将保存在内存中,包括字典查找.迭代和条件等查询.这很好,但可以放入内存的只有那么多,并且将数据从 ...

最新文章

  1. 信号量的实现和应用实验报告_Java高级编程基础:原子信号量操作实现组线程执行管理...
  2. NLP任务语义相似数据准备及实战
  3. linux 屏幕输出 高亮_如何设置SecureCRT窗口输出代码关键字高亮设置
  4. 42、谈谈你对闭包的理解?
  5. misc_register、 register_chrdev 的区别总结
  6. 链接不到服务器_新手搭建云服务器详细过程
  7. ASIHTTPRequest详解 [经典3]
  8. 使用阿里云对象存储OSS收藏老婆新垣结衣日常照
  9. mysql 5.1版本无innodb trx_MySQL 5.7: Innodb 事务子系统优化-阿里云开发者社区
  10. 简述java在安卓开发中的应用_Java 自定义注解在安卓开发中的简单运用
  11. YGC问题排查,又让我涨姿势了!
  12. day21 java的日期类
  13. 分类算法学习(三)——逻辑回归算法的原理及简单实现
  14. 深度学习实战之车牌识别项目
  15. win7 java修复工具哪个好_DLL修复工具哪个好
  16. 如何在电脑上登陆多个微信
  17. ROBOMASTER机甲大师赛视觉组学习方案
  18. js对金额数据添加最大金额单位【千、万、十万...】
  19. 20189221 2018-2019-2 《密码与安全新技术专题》第三周作业
  20. 20172313 2017-2018-2 《程序设计与数据结构》第十一周学习总结

热门文章

  1. 如何在 macOS 下安装 QGIS
  2. 思维导图 以及 日历规划软件
  3. python计算圆周率近似值_使用MicroPython计算任意位数圆周率
  4. 气象nc文件转为csv格式
  5. 如何在win11中用双硬盘或移动硬盘装Ubuntu 20.04 双系统
  6. 2022年3月青少年机器人技术等级考试理论综合试卷(一级)
  7. java Jacob调用VB编写的DLL(COM组件)
  8. EF的Include 在.NET Framework 和.net core 中进行多个表查询的时候不同的写法
  9. 大数据技术原理与应用之【NoSQL数据库】习题
  10. ArcMap加载天地图底图及出现空白问题解决方法