tornado post第3方_[33]python-Web-框架-Tornado

1.Tornado

  • Tornado:python编写的web服务器兼web应用框架

1.1.Tornado的优势

  • 轻量级web框架
  • 异步非阻塞IO处理方式
  • 出色的抗负载能力
  • 优异的处理性能,不依赖多进程/多线程,一定程度上解决C10K问题
  • WSGI全栈替代产品,推荐同时使用其web框架和HTTP服务器

1.2.Tornado VS Django

  • Django:重量级web框架,功能大而全,注重高效开发
    • 内置管理后台
    • 内置封装完善的ORM操作
    • session功能
    • 后台管理
    • 缺陷:高耦合
  • Tornado:轻量级web框架,功能少而精,注重性能优越
    • HTTP服务器
    • 异步编程
    • WebSocket
    • 缺陷:入门门槛较高

2.安装

输入命令:

pip install tornado

备注: Tornado应该运行在类Unix平台,为了达到最佳的性能和扩展性,仅推荐Linux和BSD(充分利用Linux的epoll工具和BSD的kqueue达到高性能处理的目的)

3.使用

3.1.Tornado入门程序 - (一)

#-*- coding:utf-8 -*-
import tornado.web
import tornado.ioloop#定义处理类型
class IndexHandler(tornado.web.RequestHandler):#添加一个处理get请求方式的方法def get(self):#向响应中,添加数据self.write('好看的皮囊千篇一律,有趣的灵魂万里挑一。')if __name__ == '__main__':#创建一个应用对象app = tornado.web.Application([(r'/',IndexHandler)])#绑定一个监听端口app.listen(8888)#启动web程序,开始监听端口的连接tornado.ioloop.IOLoop.current().start()
1 .在pycharm中直接运行代码 2 .如果是在ubuntu,在命令窗口输入 python 文件名.py

902fbcb12e077c5c8271e07c66e9945a.png

4.Tornado 代码解析

4.1.入门程序代码解析

  • tornado.web:tornado的基础web框架
  • RequestHandler:封装对请求处理的所有信息和处理方法
  • get/post/..:封装对应的请求方式
  • write():封装响应信息,写响应信息的一个方法
  • tornado.ioloop:核心io循环模块,封装linux的epoll和BSD的kqueue, tornado高性能处理的核心。
  • current()返回当前线程的IOLoop实例对象
  • start()启动IOLoop实力对象的IO循环,开启监听

4.2.httpserver底层处理

  • httpserver监听端口
tornado.httpserver.HTTPServer(app)
httpserver.listen(port)
  • httpserver实现多进程操作
tornado.httpserver.HTTPServer(app)
httpserver.bind(port)
httpserver.start(0/None/<0/num)
# -*- coding:utf-8 -*-
from tornado.web import Application,RequestHandler
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServerclass IndexHandler(RequestHandler):def get(self):self.write('给自己一点时间,理清所有的荒唐与期望。')if __name__ == '__main__':app = Application([(r'/',IndexHandler)])http_server = HTTPServer(app)#最原始的方式http_server.bind(8888)http_server.start(1)#启动Ioloop轮循监听IOLoop.current().start()

abf5b7600864ffd8e6e2a1382e53faf4.png

4.3.options配置

  • 全局配置
tornado.options.define(name, default, type, multiple, help
)
  • 命令行参数转换
tornado.options.parse_command_line()
#-*- coding:utf-8 -*-from tornado.web import RequestHandler,Application
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServer
import tornado.options#定义变量
tornado.options.define('port',default=8000,type=int,help="this is the port >for application")class IndexHandler(RequestHandler):def get(self):self.write('我们既然改变不了规则,那就做到最好')if __name__ == '__main__':app = Application([(r'/',IndexHandler)])tornado.options.parse_command_line()http_server = HTTPServer(app)http_server.bind(tornado.options.options.port)http_server.start(1)#启动IOLoop轮循监听IOLoop.current().start()

d353bdec18d25c6f58a8a4fa42b499c6.png

6132726530d165ea24c29b9ff1bc3d2a.png
  • 配置文件
#即在当前py文件目录创建config文件,并在py代码中加入以下代码,
tornado.options.parse_config_file("./config")
  • 配置模块:跟配置文件类似

4.4.application配置

  • 程序调试之debug配置
#自动重启+取消缓存模板+取消缓存静态文件+提供追踪信息
tornado.web.Application([(..)], debug=True)注:开发之初可以设置debug=True方便调试,开发完毕改为False.
  • 路由信息初始化参数配置
tonado.web.Application([(r””, Handler, {k:v})])
def initialize(self, k)
  • 路由名称设置及反解析
#名称设置
tornado.web.Application([url(r””, handler, {k,v}, name=“”)
])#反解析操作
reverse_url(name)

实例

# -*- coding:utf-8 -*-from tornado.web import Application, RequestHandler, url
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServerclass IndexHandler(RequestHandler):def get(self):self.write("<a href='"+self.reverse_url("login")+"'>用户登录</a>")class RegistHandler(RequestHandler):def initialize(self, title):self.title = titledef get(self):self.write("注册业务处理:" + str(self.title))class LoginHandler(RequestHandler):def get(self):self.write("用户登录页面展示")def post(self):self.write("用户登录功能处理")if __name__ == "__main__":app = Application([(r"/", IndexHandler),(r"/regist", RegistHandler, {"title": "会员注册"}),url(r"/login", LoginHandler, name="login"),])http_server = HTTPServer(app)http_server.listen(8000)IOLoop.current().start()

4.5.参数传递

  • get方式传递参数
get_query_arguments(name,default=_ARG_DEFAULT,strip=True)
get_query_argument(name ,strip=True)
  • post方式传递参数
get_body_arguments(name, default=_ARG_DEFAULT,strip=True)
get_body_argument(name ,strip=True)

实例

# -*- coding:utf-8 -*-from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServerclass IndexHandler(RequestHandler):def get(self):# 获取get方式传递的参数username = self.get_query_argument("username")usernames = self.get_query_arguments("username")print (username)print (usernames)def post(self):# 获取post方式传递的参数username = self.get_body_argument("username")usernames = self.get_body_arguments("username")print (username)print (usernames)if __name__ == "__main__":app = Application([(r"/",IndexHandler)])app.listen(8000)IOLoop.current().start()#网页运行时需要传入参数
#192.168.11.79:8000/?username=123
  • 混合方式
get_arguments(..)/get_argument(..)

实例

# -*- coding:utf-8 -*-from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoopclass IndexHandler(RequestHandler):def get(self):# 获取get方式的参数user = self.get_argument("user")print("get方式获取参数:" + str(user))def post(self):# 获取post方式的参数user = self.get_argument("user")print("post方式获取参数:" + user.encode("utf-8"))if __name__ == "__main__":app = Application([(r"/", IndexHandler)])app.listen(8000)IOLoop.current().start()
  • 其他参数
通过request获取参数数据
method/host/uri/path/query/version/headers/body/remote_ip/files

实例 - request/json

# -*- coding:utf-8 -*-from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoopclass IndexHandler(RequestHandler):def get(self):print self.requestjson_str = {"username": "admin", "password": "123123"}self.write(json.dumps(json_str))if __name__ == "__main__":app = Application([(r"/", IndexHandler)])app.listen(8000)IOLoop.current().start()
  • header
    • .add_header() .set_header() .set_default_headers()
    • 设置响应HTTP头, 前两者的不同点在于多次设置同一个项时, .add_header()叠加参数, 而.set_header()则以最后一次为准.
    • .set_default_headers()比较特殊, 是一个空方法, 可根据需要重写, 作用是在每次请求初始化RequestHandler时设置默认headers.
  • .clear_header() .clear()
  • .clear_header()清除指定的headers, 而.clear()清除.set_default_headers()以外所有的headers设置.
# add_header
self.add_header('Foo', 'one')
self.add_header('Foo', 'two')
# set_header
self.set_header('Bar', 'one')
self.set_header('Bar', 'two')# HTTP头的设置结果
# Foo → one, two
# Bar → two

# -*- coding:utf-8 -*-from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoopclass IndexHandler(RequestHandler):def set_default_headers(self):# 第二种响应头设置方式print("---------> 响应头set_default_headers()执行")self.set_header("Content-type", "application/json; charset=utf-8")self.set_header("qiku", "奇酷信息")def get(self):# 第一种操作响应头的方式:# self.set_header("Content-type", "application/json")print("---------->get方法执行")self.write("{'name':'jerry'}")self.set_header("qiku", "qikuedu.com")if __name__ == "__main__":app = Application([(r"/", IndexHandler)])app.listen(8000)IOLoop.current().start()
  • writerror
  • .send_error()用于发送HTTP错误页(状态码). 该操作会调用.clear() .set_status()
  • .write_error()用于清除headers, 设置状态码, 发送错误页. 重写.write_error()可以自定义错误页.
# -*- coding:utf-8 -*-from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoopclass IndexHandler(RequestHandler):def get(self):self.write("hello qikuedu.com")self.send_error(404, msg="页面丢失", info="家里服务器搞对象去了")def write_error(self, status_code, **kwargs):self.write("<h1>出错啦,工程师MM正在赶来的途中...</h1>")self.write("<p>错误信息:%s</p>" % kwargs["msg"])self.write("<p>错误描述:%s</p>" % kwargs["info"])if __name__ == "__main__":app = Application([(r"/", IndexHandler)])app.listen(8000)IOLoop.current().start()

数据流

  • .write()
  • 将数据写入输出缓冲区. 如果直接传入dict, 那Tornado会自动将其识别为json, 并把Content-Type设置为application/json, 如果你不想要这个Content-Type, 那么在.write()之后, 调用.set_header()重新设置就好了. 需要注意的是, 如果直接传入的是list, 考虑到安全问题(json数组会被认为是一段可执行的JavaScript脚本, 且<script src="*/secret.json">可以绕过跨站限制),list将不会被转换成json.
  • .flush()
  • 将输出缓冲区的数据写入socket. 如果设置了callback, 会在完成数据写入后回调. 需要注意的是, 同一时间只能有一个"等待"的flush callback, 如果"上一次"的flush callback还没执行, 又来了新的flush, 那么"上一次"的flush callback会被忽略掉.
  • .finish()
  • 完成响应, 结束本次请求. 通常情况下, 请求会在return时自动调用.finish(), 只有在使用了异步装饰器@asynchronous或其他将._auto_finish设置为False的操作, 才需要手动调用.finish().
  • cookie
# -*- coding:utf-8 -*-from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoopclass IndexHandler(RequestHandler):def get(self):self.write("hello qikuedu.com")self.set_cookie("loginuser", "admin老王")print self.get_cookie("loginuser")print self.cookiesif __name__ == "__main__":app = Application([(r"/", IndexHandler)])app.listen(8000)IOLoop.current().start()

页面

  • .render()
  • 返回渲染完成的html. 调用后不能再进行输出操作.
  • .redirect()
  • 重定向, 可以指定3xx重定向状态码. 调用后不能再进行输出操作.
# 临时重定向 301
self.redirect('/foo')
# 永久重定向 302
self.redirect('/foo', permanent=True)
# 指定状态码, 会忽略参数 permanent
self.redirect('/foo', status=304)
  • redirect
# -*- coding:utf-8 -*-from tornado.web import Application, RequestHandler, url
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServerclass IndexHandler(RequestHandler):def get(self):self.write("<a href='"+self.reverse_url("login")+"'>用户登录</a>")class RegistHandler(RequestHandler):def initialize(self, title):self.title = titledef get(self):self.write("注册业务处理:" + str(self.title))class LoginHandler(RequestHandler):def get(self):self.write("用户登录页面展示")def post(self):self.write("用户登录功能处理")if __name__ == "__main__":app = Application([(r"/", IndexHandler),(r"/regist", RegistHandler, {"title": "会员注册"}),url(r"/login", LoginHandler, name="login"),])http_server = HTTPServer(app)http_server.listen(8000)IOLoop.current().start()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 串口调试工具_树莓派通用串口通信实验

一、介绍对于树莓派 3B来说&#xff0c;他的UART功能有三种&#xff1a;1、内部蓝牙使用&#xff1b;2、控制终端使用&#xff1b;3、与其他设备进行串口通信。在树莓派USB TO TTL模块实验中学习了通过串口对树莓派进行控制台控制&#xff0c;让串口作为控制终端调试口即 seria…

ichat在线客服jQuery插件(可能是历史上最灵活的)

ichat是一款开源免费在线客服jQuery插件&#xff0c;通过该插件&#xff0c;您可以自由的定制属于自己的在线客服代码。 ichat充分吸收传统在线客服插件的优点&#xff0c;并加上自身的独特设计&#xff0c;使得ichat可定制性异常强大。 ichat追求简单实用&#xff0c;走小清新…

第6章 Python 数字图像处理(DIP) - 彩色图像处理1 - RGB彩色模型,RGB to Gray,CMK和CMYK彩色模型,HSI彩色模型

第6章主要讲的是彩色图像处理&#xff0c;一些彩色模型如RGB&#xff0c;CMK&#xff0c;CMYK&#xff0c;HSI等色彩模型&#xff1b;彩色模型的变换关系&#xff1b;还包含由灰度图像怎样处理成假彩色图像&#xff1b;使用彩色分割图像等。本章比较少理论还有变换的描述&#…

git 命令详解_再次学习Git版本控制工具

微信公众号&#xff1a;PHP在线Git 究竟是怎样的一个系统呢&#xff1f;为什么在SVN作为版本控制工具已经非常流行的时候&#xff0c;还有Git这样一个版本控制工具呢&#xff1f;Git和SVN的区别在哪儿呢&#xff1f;Git优势又在哪呢&#xff1f;下面PHP程序员雷雪松带你一起详细…

spring-boot 定时任务

2019独角兽企业重金招聘Python工程师标准>>> 1、建立项目 SpringBootApplication EnableAsync EnableScheduling EnableAutoConfiguration(exclude{ DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class}) ImportResource(…

使用Lightbox制作照片条

前言&#xff1a;这是国外的一个教程&#xff0c;我也很喜欢这个网页里面的教程&#xff0c;主要技术是CSS3和JQuery以及一些JQuery的插件的应用&#xff0c;当然从这些教程我也学到了他们制作时的一些思路&#xff0c;就好像做数学题那样&#xff0c;只要思路把握了&#xff0…

第6章 Python 数字图像处理(DIP) - 彩色图像处理2 - 灰度分层(灰度分割)和彩色编码,灰度值到彩色变换,Gray to RGB

第6章主要讲的是彩色图像处理&#xff0c;一些彩色模型如RGB&#xff0c;CMK&#xff0c;CMYK&#xff0c;HSI等色彩模型&#xff1b;彩色模型的变换关系&#xff1b;还包含由灰度图像怎样处理成假彩色图像&#xff1b;使用彩色分割图像等。本章比较少理论还有变换的描述&#…

值重新赋值_JavaScript-赋值运算符

好好学习&#xff0c;天天向上赋值运算符赋值运算符必须有变量参与运算&#xff0c;赋值运算符会做两件事情第一&#xff0c;将变量中原始值参与对应数学运算&#xff0c;与右侧的数据第二&#xff0c;将运算结果再重新赋值给变量变量位于操作符的左侧赋值运算符符号&#xff1…

超声换能器的原理及设计_超声波发生器、变幅杆、焊头的匹配介绍

一.超声波换能器原理与设计(超声波振动系统)匹配摘要&#xff1a;就塑料焊接机的超声波换能器系统进行设计和计算&#xff0c;并用PRO- E 三维软件绘出三维模型&#xff0c;最后进行频率分析&#xff0c;为超声波换能系统提供了有用的设计方法。关键词&#xff1a;超声波换能器…

位图法

判断集合中存在重复是常见编程任务之一&#xff0c;当集合中数据量比较大时我们通常希望少进行几次扫描&#xff0c;这时双重循环法就不可取了。位图法比较适合于这种情况&#xff0c;它的做法是按照集合中最大元素max创建一个长度为max1的新数组&#xff0c;然后再次扫描原数组…

CentOS查看和修改PATH环境变量的方法

为什么80%的码农都做不了架构师&#xff1f;>>> 查看PATH&#xff1a;echo $PATH 以添加mongodb server为列 修改方法一&#xff1a; export PATH/usr/local/mongodb/bin:$PATH //配置完后可以通过echo $PATH查看配置结果。 生效方法&#xff1a;立即生效 有效期限…

IOS简单的登陆界面

主要需要注意的几个问题&#xff1a; 1.导入图片方式最好用文件导入 代码: 在ViewController.m文件中 2.UILable常用属性 property(nonatomic,copy) NSString *text; //设置文本内容 property(nonatomic,retain) UIFont *font; //设置字体 …

第6章 Python 数字图像处理(DIP) - 彩色图像处理3 -色彩变换、彩色校正、彩色图像平滑和锐化、HSI彩色空间中的分割、RGB空间中的分割、彩色边缘检测

这里写目录标题色彩变换彩色图像平滑和锐化使用彩色分割图像HSI 彩色空间中的分割RGB空间中的分割彩色边缘检测彩色图像中的噪声色彩变换 # 图像颜色分量的显示 from PIL import Imageimg_ori Image.open(DIP_Figures/DIP3E_Original_Images_CH06/Fig0630(01)(strawberries_f…

javascript 在对象中使用 定时器_如何使用JavaScript 面向对象编程

学习目标理解面向对象开发思想掌握 JavaScript 面向对象开发相关模式面向对象介绍什么是对象Everything is object (一切皆对象)我们可以从两个层次来理解对象&#xff1a;(1) 对象是单个事物的抽象。一本书、一辆汽车、一个人都可以是对象&#xff0c;一个数据库、一张网页、一…

char数组转string_String类和其它数据类型的相互转换

对于上面的这些包装类&#xff0c;除了Character以外&#xff0c;都有可以直接使用字符串参数的构造函数&#xff0c;这也就使得我们将String类转换为这些数据类型变得相当之简单&#xff0c;即&#xff1a;Boolean(String s)、Integer(String s)、Long(String s)、Float(Strin…

python3循环一直到一个值结束_一步一步学Python3(小学生也适用) 第十七篇:循环语句for in循环...

一、Python for in循环Python for in 循环&#xff0c;是用来遍历任何数据序列&#xff0c;如一个列表&#xff0c;一个字符串&#xff0c;一个字典&#xff0c;一个元组等。for in 循环的一般语法如下&#xff1a;for item in 序列:语句块else:语句块for in 字符串&#xff1…

设置Jupyter notebook 默认工作路径,修改Jupyter notebook 默认浏览器为Chrome

这里写目录标题一 设置Jupyter notebook 默认工作路径二 修改Jupyter notebook 默认浏览器为Chrome一 设置Jupyter notebook 默认工作路径 安装好anaconda 后&#xff0c;jupyter notebook默认是有安装好的。在windows的菜单栏找到anaconda目录&#xff0c;如下图 鼠标右键点…

第10章 Python 数字图像处理(DIP) - 图像分割 基础知识 标准差分割法

This Chapter is all about image segmentation. I still not finished whole chapter, but here try to publish some for reference. 这里写目录标题基础知识import sys import numpy as np import cv2 import matplotlib import matplotlib.pyplot as plt import PIL from …

OFBiz的探索进阶

主要参照https://cwiki.apache.org/OFBIZ/ofbiz-tutorial-a-beginners-development-guide.html这个教程&#xff0c;实现的过程教程上很详细&#xff0c;故这里不多说 还参考了下http://www.hotwaxmedia.com/apache-ofbiz-blog/ofbiz/ofbiz-tutorials/ofbiz-tutorial-building-…

对GCD的一些理解和实践

对GCD的一些理解和实践GCD GCD&#xff0c;全程Grand Central Dispatch&#xff0c;是苹果为了多核并行提出的解决方案。它是使用C语言实现&#xff0c;但是由于用了block来处理回调&#xff0c;所以使用起来十分方便。并且GCD会自动管理线程的生命周期&#xff0c;不需要我们去…