web服务调用无效 参数缺少值_看这里!Python之web之王!

18b8df527fb9491dc5a8e67d30cee205.png

Tornado是使用Python编写的一个强大的、可扩展的Web服务器。它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。

Tornado与现代主流的Web服务器框架有着明显的区别:它是多进程非阻塞式的服务器,速度相当快。这得益于其非阻塞的方式和对epoll的运用。Tornado每秒可以处理数以千计的连接,对于实时Web服务来说Tornado确实是一个理想的Web框架。

优势:

轻量级web框架

异步非阻塞IO处理方式

出色的抗负载能力

优异的处理性能,不依赖多进程/多线程,一定程度上解决C10K问题

WSGI全栈替代产品,推荐同时使用其web框架和HTTP服务器

结构:

Web框架

主要包括RequestHandler用于创建Web应用程序和各种支持类的子类

HTTP服务器与客户端

主要包括HTTPServer和AsyncHTTPClient

异步网络库

主要包括IOLoop和IOStream作为HTTP组件的构建块

协程库

模块:

核心Web框架

  1. tornado.web包括Web框架大部分主要功能,包括RequestHandler和Application类。
  2. tornado.httpserver一个无阻塞HTTP服务器的实现
  3. tornado.template模板系统
  4. tornado.escapeHTML、JSON、URLs等编码解码和字符串操作
  5. tornado.locale国际化支持

异步网络底层模块

  1. tornado.ioloop核心IO循环
  2. tornado.iostream对非阻塞的Socket的简单封装以方便常用读写操作
  3. tornado.httpclient无阻塞的HTTP服务器实现
  4. tornado.netutil网络应用的实现主要是TCPServer类

系统集成服务

  1. tornado.auth使用OpenId和OAuth进行第三方登录
  2. tornado.databaseMySQL服务端封装
  3. tornado.platform.twisted在Tornado上运行Twisted实现的代码
  4. tornado.websocket实现和浏览器的双向通信
  5. tornado.wsgi其他Python网络框架或服务器的相互操作

应用模块

  1. tornado.autoload产生环境中自动检查代码更新
  2. tornado.gen基于生成器的接口,使用该模块保证代码异步运行。
  3. tornado.httputil分析HTTP请求内容
  4. tornado.options解析终端参数
  5. tornado.process多进程实现的封装
  6. tornado.stack_context异步环境中对回调函数上下文保存、异常处理
  7. tornado.testing单元测试

Tornado服务器的三个底层核心模块

1、httpserver服务于web模块的一个简单的HTTP服务器的实现

Tornado的HTTPConnection类用来处理HTTP请求,包括读取HTTP请求头、读取POST传递的数据,调用用户自定义的处理方法,以及把响应数据写给客户端的socket。

2、iostream对非阻塞式的socket的封装以便于常见读写操作

为了在处理请求时实现对socket的异步读写,Tornado实现了IOStream类用来处理socket的异步读写。

3、ioloop核心的I/O循环

Tornado为了实现高并发和高性能,使用了一个IOLoop事件循环来处理socket的读写事件,IOLoop事件循环是基于Linux的epoll模型,可以高效地响应网络事件,这是Tornado高效的基础保证。

f7c29974606bf03a2c7e41eff3d6b8e9.png

核心模块关系与请求流程

设计模型:

Tornado不仅仅是一个Web框架,它完整地实现了HTTP服务器和客户端,在此基础上提供了Web服务,它可分为四层:

1、Web框架:最上层,包括处理器、模板、数据库连接、认证、本地化等Web框架所需功能。

2、HTTP/HTTPS层:基于HTTP协议实现了HTTP服务器和客户端

3、TCP层:实现TCP服务器负责数据传输

4、Event层:最底层、处理IO事件

c6814672e6771f2780d584f96e20f8f6.png

设计模型

Tornado是一个编写对HTTP请求响应的框架。作为程序员,你的工作是编写响应特定条件HTTP请求的响应的handler。下面是一个全功能的Tornado应用的基础示例:

wcp_tornado.py

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define('port', default=8000, help='run on the given port', type=int)

class Indexfun(tornado.web.RequestHandler):
   def get(self):
      name = self.get_argument('v1','v2')
      self.write('hello, ' + name)

if __name__ == '__main__':
   tornado.options.parse_command_line()
   app = tornado.web.Application(handlers=[(r"/", Indexfun)])
   http_server = tornado.httpserver.HTTPServer(app)
   http_server.listen(options.port)
   tornado.ioloop.IOLoop.current().start()

让我们把这个例子分成小块,逐步分析它们:

importtornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define('port', default=8000, help='run on the given port', type=int)

程序顶部导入了tornado下的模块,而且使用了tornado.options从命令行读取设置,如果执行命令行没有设置port参数,则使用默认值进行替代,而且格式要与type设置的格式相同。

classIndexfun(tornado.web.RequestHandler):
   def get(self):

定义了一个tornado的请求处理函数类Indexfun,当处理一个请求时,Tornado将这个类实例化,并调用与HTTP请求方法所对应的方法。在这个例子中,我们只定义了一个get方法,也就是说这个处理函数将对HTTP的GET请求作出响应。我们稍后将看到实现不止一个HTTP方法的处理函数。

name = self.get_argument('v1','v2')

Tornado的RequestHandler类有一系列有用的内建方法,包括get_argument,我们在这里从一个查询字符串中取得参数greeting的值。如果这个参数没有出现在get请求的url中,Tornado将使用get_argument的第二个参数作为默认值。

self.write('hello, ' + name)

RequestHandler的另一个有用的方法是write,它以一个字符串作为函数的参数,并将其写入到HTTP响应中。在这里,我们使用请求中greeting参数提供的值插入到greeting中,并写回到响应中。

if __name__ == '__main__':
   tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", Indexfun)])

这是真正使得Tornado运转起来的语句。首先,我们使用Tornado的options模块来解析命令行。然后我们创建了一个Tornado的Application类的实例。传递给Application类init方法的最重要的参数是handlers。它告诉Tornado应该用哪个类来响应请求。

http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

从这里开始的代码将会被反复使用:一旦Application对象app被创建,我们可以将其传递给Tornado的HTTPServer对象,然后使用我们在命令行指定的端口进行监听(通过options.port取出。)最后,在程序准备好接收HTTP请求后,我们创建一个Tornado的IOLoop的实例。

注意:tornado5.0之后的版本,instance()已经成为current()的别称,即就是调用instance方法时,实际上调用的是current方法。

再看一眼wcp_tornado.py中的这一行:

app = tornado.web.Application(handlers=[(r"/", Indexfun)])

这个handlers参数很重要,它应该是一个元组组成的列表,其中每个元组的第一个元素是一个匹配HTTP请求的路径的正则表达式,这个路径是URL中主机名后面的部分,不包括查询的参数。,第二个元素是一个RequestHanlder类,也就是我们编写的响应请求的视图函数类。在wcp_tornado.py中,我们只指定了一个正则表达式-RequestHanlder对,但你可以按你的需要指定任意多个。


db82f961e88b13c1b70a9e428ca28704.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值