1、创建Tornado服务器
    1、创建Application对象
        Application是Torando最核心的类
        所有关于服务器的配置信息都写在Application构造器中
        以构造器的参数形式传入,比如路由列表
        路由列表的作用告诉Tornado,对特定路径的请求,由哪个类进行响应
        app = Application([('/',IndexHandler)])
    2、创建真正的服务器程序
        server = HTTPServer(app)
    3、让服务器监听某一个端口
        server.listen(8888)
    4、当前线程中启动服务器
        IOLoop.current().start()
    5、创建一个响应类,继承自RequestHandler,
        对请求的方式(get/post),调用重写父类的get/post
        class IndexHandler(RequestHandler):
        def get(self, *args, **kwargs):
            self.write('hello tornado')
        def post(self, *args, **kwargs):
            pass
2、对程序中可能经常变化的值应该提取到配置文件中     
    1、创建文件夹,在文件夹中创建file,充当配置文件
        PORT = 9999
    2、在源代码中引用
        define('变量名',type=类型,default=默认值)
        parse_config_file('配置文件所在的路径')
        options.变量名
    示例:
        define('PORT',type=int,default=8888)
        parse_config_file('../config/config')
        server.listen(options.PORT)

from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.options import define, parse_config_file, options
from tornado.web import Application, RequestHandlerclass IndexHandler(RequestHandler):def get(self, *args, **kwargs):self.write('<a href=/java>java</a><br>')self.write('<a href=/python>python</a>')def post(self, *args, **kwargs):passdefine('PORT',type=int,default=8888)
parse_config_file('../config/config')class PythonHandler(RequestHandler):def get(self, *args, **kwargs):self.write('<a href=/java> goto java</a>')class JavaHandler(RequestHandler):def get(self, *args, **kwargs):self.write('hello java')#1、创建application对象
app = Application([('/',IndexHandler),('/python',PythonHandler),('/java',JavaHandler)])
#2、创建真正的tornado服务器
server = HTTPServer(app)
#3、设置监听端口
server.listen(options.PORT)
#4、启动服务器
IOLoop.current().start()

3、如果对路由列表中不存在的路径发起请求,会得到404:Not Found
4、Python中,带有HTML标签的字符串也仅仅是一个普通的字符串,但是将这样的字符串作为服务器的响应交给客户端时,

  客户端会进行解析,渲染后呈现给客户,客户端(浏览器)会根据HTML标签做不同的渲染处理
5、可以利用正则表达式匹配具有一定规律的所有的路径,路径的具体内容会以参数的形式传入get/post方法,

  参数名称可以随意指定,但是最好给参数之默认值,一般默认值为None
6、利用get_body_argument 或 get_body_arguments可以获取请求体中的参数get_body_argument获得的是单独的参数值( 最后一个参数)
    get_body_arguments获得的是列表形式的参数值,
    另外两者存在明显的区别
    1、使用get_body_argument时,最好提供默认值,防止访问时没有提供服务器需要的参数导致400:bad request.

    使用get_body_arguments时,如果客户端没有提供服务器需要的参数,只会获得一个空列表,不会产生错误
    2、如果在请求体中存在重名的参数,get_body_argument仅能取到最后一个设置的参数值,而get_body_arguments可以取得所有的    重名的键所对应的值
7、界面的跳转:self.redirect("路径")
8、利用get_query_argument 或get_query_arguments可以获得以get方式发起请求时携带的参数,
     前者获取的是单独的参数值,后者获得的是以列表的形式组成的参数值,两者的区别
     同get_body_arguments
9、利用get_argument获取请求参数,就像get_query_argument + get_body_arguments,无论请求参数是出现在请
      行中还是请求体中,只要有该参数就能获取到该参数值,首先获取请求行中的参数在获取请求体中的参数
10、RquestHandler里面有一个属性,叫做request,引用一个HttpServerRequest类型的对象,
       该对象中封装了与请求相关的几乎一切内容,我们可以利用self.requset.headers获取所有请求头,
       headers是以字典的方式组织请求头中的名和值,可以利用self.request.files获取上传文件,
       files也是以字典的形式组织上传的文件,每一个上传文件都有3个属性:
            1、type属性,表示文件的类型(例如png/jpeg)
            2、filename属性,表示文件的文件名称
            3、body属性,表示二进制的文件内容
            4、通过标准额IO操作,就可以将上传的文件保存到服务器

1、框架作者通过“钩子方法”将框架中的代码和使用者的代码结合起来,完成一个复杂的业务
    在Tornado框架中,从截获请求到生成响应中间有很多步骤,Tornado作者设置了若干个钩子方法供使用者根据具体业务需要重写:
    钩子方法包括:
        set_default_headers:设置默认响应头
        initialize:接收路由列表初始化参数
        get/post:生成响应内容
        on_finish:释放或关闭资源
    钩子方法没有必要非得重写
2、
    调用set_header("头名","值")设置默认响应头
    调用set_status(状态码,'状态码描述')设置响应(状态码)
        注意:HTTP协议中不存的状态码,要手动给出状态描述,否则会产生500错误,在实际开发中谨慎用HTTP协议中不存在的状态码
    调用send_error(状态码)触发write_error方法产生错误信息,
        说明:write_error方法是父类方法,如果要改写,注意要调用父类方法的原有逻辑
3、服务器两种常见的响应格式
    1、JSON字符串
        操作步骤1:
            1、构建一个Python字典,然后将字典转为JSON字符串,
            2、设置响应头中Content-Type的值为application/json;charset=UTF-8
            3、将JSON字符串作为服务器的响应交给客户端
        操作步骤1:
            1、构建一个Python字典
            2、然后直接将字典作为服务器的响应交给客户端
            3、说明:Tonado帮助我们完成了从Python字典到JSON字符串的转换工作
    2、HTML页面(模板)
4、模板的使用
    1、创建一个存放模板文件的文件夹,(比如:mytemplate)
    2、在模板文件夹下创建HTML文件充当模板
    3、在Tornado中配置模板路径,在Application构造器中以关键字template_path传入路径(比如:template_path='mytemplate')
    4、使用模板self.render('模板文件的名字')
        注意:render是将作为模板的HTML页面转为字符串,再将字符串作为服务器的响应交给客户端
5、
    在模板中,可以使用{{}}插入变量,算术表达式或函数表达式(内置的函数表达式,或者自定义的函数表达式),
    但是,必须在render方法中对模板中使用的变量,算术表达式的变量以及函数表达式中的自定义函数进行赋值,
    不然会产生500错误
    注意:render传递的变量不是以字典的形式,self.render("blog.html",a=50,b=500)
6、在模板中。可以使用{%%}插入语句
    循环语句{% for 循环结果 in 可迭代对象 %} ... {% end %}
    注意:
        1、可迭代对象也是一个变量,对负责render,谁就要给可迭代对象赋值
        2、语句结束时,只需要写{% end %},Tornado会进行就近匹配原则进行匹配
    分支语句{% if 条件 %} ...{% else %} ... {% end %}
7、在模板中,使用静态资源
    1、创建存放静态资源的文件夹,比如mystatic,将各种静态资源(图片,CSS,JS)分子文件夹存入mystatic
    2、配置静态资源的路径,配置方式就是在Application的构造器中添加参数:static_path = “mystatic”
    3、使用静态资源
        1、方式一:需要静态资源的地方写static/子文件夹/静态资源文件名称
            示例:static/images/xxx.jpg
        2、方式二:使用Tornado的内置函数,构建静态资源的路径{{static_url('静态资源的路径')}}
            示例:{{static_url('images/xxx.jpg')}}
        static是Tornado中的关键字,Tornado会根据static_path来解析static
8、块的使用
    为了减少写各个子模板时重复代码的书写,就把各个子模板中相同内容提取到一个公共模块中(一般公共模板的名字都为base.html)
    各个子模板通过继承公共模板{% extends base.html %}就可以获得这些相同的内容
    在写公共模板时,要使用语句块{% block 块名称%}标示出各个子模板可能不同的地方,这样以后再写子模板时,只要关注各个子模板不同的地方即可
9、模块的使用
    1、在模板文件夹(mytemplate)下创建模块文件夹,用来存放模块文件
    2、在模块文件夹下,创建模块文件
    3、在模块文件中需要使用模块文件的位置,插入语句:{% module xxx()%} xxx是用来将模块文件转为(render)一个字符串插入到模板文件中
    4、配置Application,利用关键字ui_modules进行传参,参数是字典,{"xxx":自定义module类}
    5、创建自定义module类继承自UIModule类,重写父类中的钩子方法render,render方法一定要返回一个字符串,该字符串就是插入模板中的
        内容,一般该字符串是根据要使用的模块文件生成的,从模块文件到字符串只需要调用父类的render_string方法就可以完成
        注意:如果模块文件中包含变量,变量表达式,自定义函数表达式,一定在调用render_string方法时,对变量或自定义函数赋值。
    使用模块的意义:
        并不在于让模板变得简洁,使用模块的意义在于模块是可以复用的,构建新的页面时,是可以使用已有模块进行皮娜姐组成,而不用在从头构建
10、Tornado的自动转义
    Tornado针对<script></script>会默认开启自动转义功能,以防止恶意代码的执行
    所谓的转义就是将<script>标签变为&lt;script&gt;
    如果要关闭该功能,有两种方式:
        1、在Application的构造器中某一关键字传参autoescape传入,值None,会影响到所有模板中的HTML文件都关闭转义
        2、在需要关闭自动转义的页面中加入语句:{% autoescape None %}
        需要注意的是,Google Chrome浏览器安全级别比较高,即使Tornado关闭了转义,Chrome浏览器依然会拦截<script>
        标签的文本的执行,可以通过设置响应头来压制Chrome的安全机制:set_header("X-XSS-Protection",0)
11、如何快速学习网络框架
    从以下三点:
    1、如何配置路由
    2、如何使用模板
    3、如何加载静态资源

转载于:https://www.cnblogs.com/xdl-smile/p/9622628.html

python_tornado相关推荐

  1. 21day学通python epub_21天就让你掌握Python语言,《21天学通Python》PDF版送给你去学...

    Python的学习书籍小编看过很多,但是这本<21天学通Python>真的是堪称极品! 本书的作者团队成员为一线开发工程师.资深编程专家或专业培训师,在编程开发方面有着丰富的经验,并已出版 ...

  2. python神经网络多元函数_阿里达摩院推荐的最新400集python教程,据说懂中文就能上手...

    小编的内心是强大的,网友虐我千百遍,我待网友如初恋,因为今天又给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 为了吸取教训,小编一定要分享一下攻略,"怎样获得小编分享的教程 ...

  3. ole2高级编程技术 pdf_21天快速掌握Python语言,《21天学通Python》PDF版送给你去学...

    Python的学习书籍小编看过很多,但是这本<21天学通Python>真的是堪称极品! 本书的作者团队成员为一线开发工程师.资深编程专家或专业培训师,在编程开发方面有着丰富的经验,并已出版 ...

  4. 逻辑性不好可以学python吗_如果本文若未能让你学会“Python”,可能真的不适合学习Python...

    很多小伙伴们会问学习Python难学吗? python就是以他简单易学出名的.几乎是现在最简单,却可塑性最高的语言了.一般有其它编程语言基础的,自学,三小时左右就能学会.现在Python都有给小朋友的 ...

  5. ole2高级编程技术 pdf_别不信,21天就可以学会python,《21天学通Python》pdf免费领取...

    python的学习书籍小编看过很多,但是这本<21天学通python>真的是堪称极品!本书的作者团队成员为一线开发工程师.资深编程专家或专业培训师,在编程开发方面有着丰富的经验,并已出版过 ...

  6. python基础教程-北大学霸自学这套Python教程,7天开发12款游戏,堪称宝藏教程

    下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 学习Python的人,总会到处寻找资料,比如这里看点视频,那里看点文章,但最后依然学不好Python.因为缺乏 ...

  7. 逐条讲解python_名校教授推荐:Python458集大型视频,从正确的方向出发学习

    在家办公的那段日子,原以为是快乐摸鱼的开始,可是问了一圈身边的朋友,基本都处于"007"的状态.好多次明明已经合上电脑了,微信上来个需求就得立马处理. 最近开始复工,也依然不能准时 ...

  8. python基础教程价格范围_价值18980元的968集Python教程,在此透露给大家!速度来拿哇...

    我是完全自学的,看完这条回答你就不用花钱学了.一千多的课程也就是基础课,并不会给你有多深入.如果要是学基础的话,看看下面的学习线路图以及相关的学习方法足够了.贴一个我之前自学的路径图和方法. 小白学P ...

  9. 40天python新手入门教程_自律改变自我!努力40天轻松从入门到精通Python

    我是完全自学的,看完这条回答你就不用花钱学了.一千多的课程也就是基础课,并不会给你有多深入.如果要是学基础的话,看看下面的学习线路图以及相关的学习方法足够了.贴一个我之前自学的路径图和方法. 小白学P ...

  10. 阿里达摩院python教程真的吗_阿里达摩院推荐的最新400集python教程,据说懂中文就能上手...

    小编的内心是强大的,网友虐我千百遍,我待网友如初恋,因为今天又给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 为了吸取教训,小编一定要分享一下攻略,"怎样获得小编分享的教程 ...

最新文章

  1. 使用Python查询国内 COVID-19 疫情
  2. php面向对象面试题
  3. apt-get出现no public key available for the following key IDs
  4. 20140408- Network 基本知识
  5. 创建Maven项目时,GroupId和Artifact Id填写
  6. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1045:收集瓶盖赢大奖
  7. 我心目中未来的计算机200字,我心目中未来的计算机.doc
  8. 哈佛博士后入职街道办引关注,官方最新回应
  9. JAVA知识基础(三):修饰符
  10. 【XDA汉化组编写】Android软件汉化/精简/去广告/优化教程 FAQ
  11. 我的世界java村民繁殖_我的世界:1.14版本刷新几率小的五种村庄,没有村民咋回事?...
  12. SUFFER软件测试工程师,Ubuntu9.0.4下FreeSurfer的安装(转)
  13. 系统架构设计师-软件开发模型(螺旋模型)
  14. ObjectARX开发(自定义块以及属性的获取)
  15. Mozilla5.0的意思
  16. C语言程序的undefined,c语言中undefined reference to 怎么解决
  17. 【群体遗传】Fst(群体间分化指数)
  18. 芯动科技2023校招 FPGA岗位笔试
  19. CSDN日报180521——《如何选择值得深入学习的技术方向》
  20. HDU - 7047 - Link with Balls ( 插板法 + 组合数 )

热门文章

  1. C#开发移动应用 - 环境搭建
  2. 大数据实验室(大数据基础培训)——Kafka的安装、配置及基础使用
  3. linux ftp命令参数全集
  4. [Hyper-V]使用操作系统模板创建新的虚拟机
  5. Ubuntu免密码输入关机脚本
  6. UVA 10917 Walk Through the Forest 最短路 + DP
  7. feathers ui 实现机制深入解析(feathers ui 源码解析-原创)
  8. LINUX开源监控平台Nagios(主机监控配置)
  9. xmlhttp上传文件(转贴)
  10. Mac OS安装mysql教程