路由系统

  在web框架中,路由表中的任意一项是一个元组,每个元组包含pattern(模式)和handler(处理器)。当httpserver接收到一个http请求,server从接收到的请求中解析出url path(http协议start line中),然后顺序遍历路由表,如果发现url path可以匹配某个pattern,则将此http request交给web应用中对应的handler去处理。

  路由系统其实就是 url 和 类 的对应关系,这里不同于其他框架,其他很多框架均是 url 对应 函数,Tornado中每个url对应的是一个类。路由表,卸耦了http server层和web application层。

  路由表具有非常重要的作用,卸耦了http server层和web application层。由于有了url路由机制,web应用开发者不必和复杂的http server层代码打交道,只需要写好web应用层的逻辑(handler)即可。

  Application类位于web.py,一个Application类的实例相当于一个web应用。

application = tornado.web.Application([
(r"/index", MainHandler),
]) #把一个路由表(一个列表)作为参数,传递给Application类的构造函数,创建了一个实例,然后再把这个实例传递给http_server。那么当客户端发起”get /”请求的时候,http server接收到这个请求,在理由表中匹配url pattern,最后交给MainHandler去处理。

路由表 

  tornado原生支持RESTful比如我给用户提供了查询书、购买书、取消购买书的功能,那按理说我需要给用户三个url,查询书比如说是:http://www.book.com:8888/search,购买书是:http://www.book.com:8888/buy,取消购买书是:http://www.book.com:8888/delete。用户访问不同的url进行他需要的操作。上面仅仅是三个基本的功能,一个网站提供的功能肯定特别多,那岂不是要给用户很多个url?那有没有更简便的方式呢,客户端和服务端进行一个约定,都只需要维护一个url就行了,比如下面这种:

# 客户端和服务端都只维护下面这一个url
书本url:http://www.book.com:8888/index # 客户端和服务端通过不同的method来执行不同的操作
method:get
method:post
method:delete
method:put

  上面的这种约定是一种软件架构方式:RESTful,双方约定好怎么获取服务和提供服务,然后只维护一个url、通过改变请求的method来通信。这也是“面向资源编程”的概念,将网络中的所有东西都视为资源。Tornado原生支持RESTful,这也是其优势之一。

import tornado.ioloop
import tornado.web user_info = []
class MainHandler(tornado.web.RequestHandler): # 用户以get方式访问,就执行get方法
def get(self):
# self.write("Hello, world")
self.render('index.html') # 用户以post方式访问,就执行post方法
def post(self, *args, **kwargs):
self.write('post') # 用户以delete方式访问,就执行delete方法
def delete(self):
self.write("delete") settings = {
'template_path': 'template',
'static_path': 'static',
} application = tornado.web.Application([
(r"/index", MainHandler),
], **settings) if __name__ == "__main__":
application.listen(8888)
# epoll + socket
tornado.ioloop.IOLoop.instance().start()

demo

tornado原生支持二级域名

域名的划分:

  .com 顶级域名
  baidu.com 一级域名
  www.baidu.com 二级域名
  bbs.baidu .com 二级域名
  tieba.baidu .com 二级域名
注意:很多人都误把带www当成一级域名,把其他前缀的当成二级域名,这是错误的,其实www.baidu.com 与bbs.baidu .com同为二级域名,只是人们习惯使用www为前缀的二级域名作为网站的主域名入口罢了。 

  我们可以使用二级域名用来区分不同的业务,tornado在url划分的时候,比django更加友好;django是在主域名后面接着2级域名,配置使用include 进行业务分类url。

class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("www") class CmdbMainHandler(tornado.web.RequestHandler):
def get(self):
self.write("cmdb") settings = {
'template_path': 'template',
'static_path': 'static',
} # 默认二级域名是www;用户输入www.freely.com:8888/index时,执行MainHandler里的方法。
application = tornado.web.Application([
(r"/index", MainHandler),
], **settings) # 用户输入的域名是cmdb.freely.com:8888/index时,执行CmdbMainHandler里的方法。
application.add_handlers("cmdb.freely.com",#重新设置url使用add_handlers方法,第一个参数是2级域名名称,后面是url列表。
[
(r"/index", CmdbMainHandler),
], **settings) # django里就是www.freely.com:8000/index、www.freely.com:8000/cmdb这样。

最新文章

  1. ZOJ 2048 highways
  2. PHP如何通过CURL上传文件
  3. PAT 1027. 打印沙漏(20)
  4. 使用EasyUI布局时出现混乱瞬间的解决方法
  5. OC数组常见操作
  6. 用vs2008打开vs2012项目
  7. Spring分布式事务实现(适用于spring-tx 2.5)
  8. jquery学习笔记之二
  9. os基础
  10. Android 最热的高速发展框架XUtils
  11. Redis系统学习 一、基础知识
  12. C语言 memcpy二维数组的复制
  13. 如果服务器不能把编码格式改成UTF8怎么办?(20161113)
  14. PostgreSQL 下生成 UUID(Guid)
  15. javascript-发布订阅模式
  16. 剥掉层层外衣后的RPC是什么样子的?
  17. Linux下编译GDAL
  18. 【转载】c++类的实例化与拷贝
  19. 韩顺平Linux学习笔记
  20. Ubuntu下使用Windows应用程序集锦

热门文章

  1. winform 查看远程服务器上的文件
  2. linux学习笔记22---命令diff和diff3
  3. 设置Tomcat编码(UTF-8)
  4. 可执行文件格式elf和bin
  5. VC编译的时候因为加载符号导致编译过程异常缓慢的处理
  6. 【理财】阅读:Millionaire Teacher
  7. Torch-RNN运行过程中的坑 [1](读取Lua非空table,size为0)
  8. Linux文件的打包与压缩
  9. WPF数据验证(4)——响应与获取验证错误
  10. IntelliJ Idea Hide excluded folders 隐藏或显示你需要的文件夹