一、Tornado Web应用程序的结构

  1. import tornado.web
  2.  
  3. class LoginHandler(tornado.web.RequestHandler):
  4.  
  5. def get(self):
  6. self.write('www')
  7.  
  8. def post(self):
  9. pass
  10.  
  11. #生成路由规则
  12. application= tornado.web.Application([
  13. (r"/login/",LoginHandler),
  14. ])
  15.  
  16. if __name__ == '__main__':
  17. application.listen(8888) #创建socket对象并将其添加到select或者epoll中
  18. tornado.ioloop.IOLoop.instance().start() #将select或者epoll进行死循环

Tornado Web应用程序通常由一个或多 个RequestHandler子类,一个Application将传入请求路由到处理程序的对象以及一个main()启动服务器的功能组成。

RequestHandler:Tornado Web应用程序的大部分工作是在的子类中完成的RequestHandler。主入口点的处理程序的子类是所处理的HTTP方法命名的方法:get()、post()等。每个处理程序可以定义这些方法的一个或多个来处理不同的HTTP操作。在处理程序中,调用诸如RequestHandler.render或的 方法RequestHandler.write以产生响应。

Application:负责全局配置,包括将请求映射到处理程序的路由表。

二、路由系统

tornado的路由系统是一个url对应一个类,这与django的CBV模式类似。

  1. ...
  2.  
  3. #生成路由规则
  4. application= tornado.web.Application([
  5. (r"/login/",LoginHandler),
      (r"/order/([0-9]+)", OrderHandler, dict(db=db), name="order")
  1. ]) ...

  路由表是URLSpec对象(或元组)的列表,每个对象(至少包含)一个正则表达式和一个处理程序类。使用第一个匹配规则。如果正则表达式包含捕获组,则这些组是路径参数,并将传递给处理程序的HTTP方法。如果将字典作为的第三个元素传递URLSpec,则它会提供将传递给 的初始化参数RequestHandler.initialize。

三、视图函数

  • 获取请求相关信息
  1. self.get_cookie() #获取cookie
  2. v = self.get_argument('p') #可以用于获取用户的get请求和post请求发来的数据
  3. print(v)
  4. self.request #封装了用户发来的所有请求(如果找不到相关请求就去request中找)
  5. # print(type(self.request))
  6. # from tornado.httputil import HTTPServerRequest
  • 视图
  1. import tornado.web
  2.  
  3. class LoginHandler(tornado.web.RequestHandler):
  4.  
  5. def get(self):
  6. print(self.get_argument('p'))    
         self.set_cookie(‘k1’,'v1') #可以进行cookie的设置    
    self.set_header('k2','v2') #可以设置header
  7. #self.write('www') #往页面上写数据
         #self.redirect('/index/')#重定向
  8. self.render('login.html')
  9.  
  10. def post(self):
  11. print(self.get_argument('user'))
  12.  
  13. settings={
  14. "static_path":"static", #这是放置静态文件的目录名称
  15. "static_url_prefix":"/sta/", #这是访问静态文件引用的url前缀
  16. "template_path":"templates"
  17. }
  18.  
  19. #生成路由规则
  20. application= tornado.web.Application([
  21. (r"/login/",LoginHandler),
  22. ],**settings) #将settings传入
  23.  
  24. if __name__ == '__main__':
  25. application.listen(8888)
  26. tornado.ioloop.IOLoop.instance().start()
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <link rel="stylesheet" href="/sta/commons.css" />
  7. </head>
  8. <body>
  9. <h1>登陆</h1>
  10. <form method="post">
  11. <input type="text" name="user">
  12. <input type="submit" value="提交">
  13. </form>
  14. </body>
  15. </html>

login.html

四、模板引擎

1、模板及静态文件的配置

  默认情况下,Tornado在与.py引用模板文件的目录相同的目录中查找模板文件。要将模板文件放在不同的目录中,需要在settings中进行配置(使用template_path参数),以及静态文件目录也是在settings中进行配置。

这可以在Tornado的源码中查看:

所以,可以在settings中进行设置,并且传入Application中:

  1. settings={
  2. "static_path":"static", #这是放置静态文件的目录名称
  3. "static_url_prefix":"/sta/", #这是访问静态文件引用的url前缀
  4. "template_path":"templates" #这是模板文件的目录名称
  5. }
  6.  
  7. #生成路由规则
  8. application= tornado.web.Application([
  9. (r"/login/",LoginHandler),
  10. ],**settings) #将settings传入

在根目录下建立templates目录,内部生成html文件:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <link rel="stylesheet" href="/sta/commons.css" /> <!--引入静态文件-->
  7. </head>
  8. <body>
  9. <h1>登陆</h1>
  10.  
  11. </body>
  12. </html>

login.html

2、模板渲染

  Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {% 和 %} 包起来的 例如 {% if len(items) > 2 %}。表达语句是使用 {{ 和 }} 包起来的,例如 {{ items[0] }}

  控制语句和对应的 Python 语句的格式基本完全相同。我们支持 ifforwhile 和 try,这些语句逻辑结束的位置需要用 {% end %} 做标记。还通过 extends 和 block 语句实现了模板继承。

  • 返回字符串、列表、字典

tornado_.py

  1. class LoginHandler(tornado.web.RequestHandler):
  2.  
  3. def get(self):
  4. # print(self.get_argument('p'))
  5. self.render('login.html',**{'k1':'v1','k2':['v21','v22'],'k3':{'name':'王五','age':18}})
  6.  
  7. def post(self):
  8. pass

login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <!--<link rel="stylesheet" href="/sta/commons.css" />-->
  7. </head>
  8. <body>
  9. <h1>登陆</h1>
  10.  
  11. #取字符串的值
  12. {{k1}}
  13. #循环列表
  14. {%for item in k2%}
  15. {{item}}
  16. {%end%}
  17.  
  18. {{k3['name']}} #方法一、取name的值
  19. {{k3.get('name')}} #方法二,取name的值
  20.  
  21. #循环字典
    {%for k,v in k3.items()%}
      {{k}}-{{v}} <br>
    {%end%}
    </body>
  22.  
  23. </html>
  • 返回函数或者类

Tornado中返回的可以是函数或者类,分别叫做UIMethod和UIModule。

(1)在utils文件夹中建立如上的uimethods.py以及UIModules.py文件

uimethods.py

  1. def display_str(self):
  2. print(self) #<__main__.LoginHandler object at 0x0000000003645A20>
  3. return 'hello'

UIModules.py

  1. from tornado.web import UIModule
  2. from tornado.web import escape
  3.  
  4. class UILogin(UIModule): #可以传参数也可以不传 UIModule中还有很多方法,可以进入查看
  5.  
  6. def embedded_css(self):
  7.  
  8. return 'body{color:red}' #可以添加css样式
  9.  
  10. def css_files(self):
  11.  
  12. return 'css/login.css' #可以添加css文件
  13.  
  14. def render(self, *args, **kwargs):
  15.  
  16. print(self,args,kwargs)
  17.  
  18. # return '<h1>login</h1>'
  19. return escape.xhtml_escape('<h1>login</h1>') #保留标签

(2)在settings中进行注册,注意只需要导入文件名即可

  1. from utils import uimethods as mt
  2. from utils import uimodules as md
  3. settings={
  4. "static_path":"static", #这是放置静态文件的目录名称
  5. "static_url_prefix":"/sta/", #这是访问静态文件引用的url前缀
  6. "template_path":"templates",
  7. "ui_methods":mt,
  8. "ui_modules":md
  9. }

(3)在模板文件中直接使用

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <!--<link rel="stylesheet" href="/sta/commons.css" />-->
  7. </head>
  8. <body>
  9. <h1>登陆</h1>
  10.  
  11. {{display_str()}} <!--UIMethods-->
  12. <br>
  13. {% module UILogin(123) %} <!--UIModules 可以传参数也可以不传参数-->
  14.  
  15. <form method="post">
  16. <input type="text" name="user">
  17. <input type="submit" value="提交">
  18. </form>
  19. </body>
  20. </html>

参考:http://www.tornadoweb.org/en/stable/guide/structure.html

 

Tornado框架的简单使用的更多相关文章

  1. tornado框架的简单实用

    一.安装模块 pip3 install tornado 二.简单的起服务的方法 import json, datetime from tornado.web import RequestHandler ...

  2. tornado框架学习及借用有道翻译api做自动翻译页面

    趁着这几天有时间,就简单的学了一下tornado框架,简单做了个自动翻译的页面 仅为自己学习参考,不作其他用途 文件夹目录结构如下: . ├── server.py ├── static │   └─ ...

  3. python运维开发(二十二)---JSONP、瀑布流、组合搜索、多级评论、tornado框架简介

    内容目录: JSONP应用 瀑布流布局 组合搜索 多级评论 tornado框架简介 JSONP应用 由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. ...

  4. Tornado框架简介

    -------------------简介------------------- 1.概念:     Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器 ...

  5. tornado框架&三层架构&MVC&MTV&模板语言&cookie&session

    web框架的本质其实就是socket服务端再加上业务逻辑处理, 比如像是Tornado这样的框架. 有一些框架则只包含业务逻辑处理, 例如Django, bottle, flask这些框架, 它们的使 ...

  6. tornado框架基础10-websocket

    websocket 01 长轮询 在网页,我们经常扫码登录,结合之前的学习的知识点,来思考下,前端是如何知道用户在手机上扫码登录了呢? 长轮询:客户端不断的向服务器发送请求 缺点: \1. 开销大 \ ...

  7. Tornado 框架

    Tronado为何物 Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器兼Web应用框架,由FriendFeed公司在自己的网站FriendFeed中使 ...

  8. 说什么也要脱单——Python WEB开发:用Tornado框架制作简易【表白墙】网站

    先来哔哔两句:(https://jq.qq.com/?_wv=1027&k=QgGWqAVF) 今天我们要用Python做Web开发,做一个简单的[表白墙]网站.众所周知表白墙的功能普遍更多的 ...

  9. python tornado框架实现CRUD

    1.本例采用postgresql数据库,创建数据表 user_tbl ),signup_date date); 2.webapi接口 (1)tornado框架配置 t_tornado.py #-*- ...

随机推荐

  1. canvas 绘制三次贝塞尔曲线

    代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  2. BZOJ4710 [Jsoi2011]分特产 容斥

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4710 题解 本来想去找一个二项式反演的题的,结果被 https://www.cnblogs.c ...

  3. Python lambda 多变量

    >> x = list(map(lambda x, y: (x>3, y>0), (1,2,3,4,5), (0,1,2,3,4)))>>> x[(False ...

  4. 远程桌面连接,运维工程师-必备软件【MultiDesk】

    实习时,在本地一家大型女装公司做桌面运维,服务器碰得到少,大部分时间都是在维护同事的电脑桌面,什么360全家桶了,毒霸了,都是通过远程工具 teamviewer 去搞定的. 后来做了前端开发,免不了自 ...

  5. 【8.0.0_r4】AMS分析(十六)(ActivityManagerService.java上)

    代码位于frameworks/base/services/core/java/com/android/server/am/,一共有七十个文件. Java源码位于package com.android. ...

  6. linux查找一个文件的路径

  7. PHP curl_exec函数

    curl_exec — 执行一个cURL会话 说明 mixed curl_exec ( resource $ch ) 执行给定的cURL会话. 这个函数应该在初始化一个cURL会话并且全部的选项都被设 ...

  8. Git 中关于一次完整的提交的命令

    1.创建仓库(git init .git clone URL) 有两种新建 Git 项目仓库的方法.第一种是在本地通过初始化来创建新的 Git 仓库.第二种是从已有的 Git 远程仓库中克隆出一个仓库 ...

  9. Sqlachemy的警告SAWarning: The IN-predicate on "sns_object.BIZ_ID" was invoked with an empty sequence. This results in a contradiction, which nonetheless can be expensive to evaluate.

    我在使用db_session.query,查询的时候idlist是个空值时候,执行下面的语句就会出现警告.其中后面delete(synchronize_session=False)是删除前面的一堆查询 ...

  10. (转)Docker入门——Dockerfile详解

    转:https://www.cnblogs.com/sorex/p/6481407.html 基本示例 FROM MAINTAINER LABEL RUN ADD COPY CMD ENTRYPOIN ...