PythonWeb框架:Tornado
Tornado:Tornado web rver
官⽅⽂档
中⽂⽂档
Tornado概览
浅谈Python Web 框架:Django, Twisted, Tornado, Flask, Cyclone 和 Pyramid
Tornado⼊门
o
Tornado:python编写的web服务器兼web应⽤框架
o的优势
轻量级web框架
异步⾮阻塞IO处理⽅式
出⾊的抗负载能⼒
优异的处理性能,不依赖多进程/多线程,⼀定程度上解决C10K问题
WSGI全栈替代产品,推荐同时使⽤其web框架和HTTP服务器
o VS Django
Django:重量级web框架,功能⼤⽽全,注重⾼效开发
内置管理后台
内置封装完善的ORM操作
ssion功能
后台管理
缺陷:⾼耦合
Tornado:轻量级web框架,功能少⽽精,注重性能优越
HTTP服务器
异步编程
WebSocket
缺陷:⼊门门槛较⾼
2.安装
输⼊命令:
pip install tornado
备注:
Tornado应该运⾏在类Unix平台,为了达到最佳的性能和扩展性,仅推荐Linux和BSD(充分利⽤Linux的epoll⼯具和BSD的kqueue达到⾼性能
处理的⽬的)
3.使⽤
o⼊门程序 - (⼀)
#-*- coding:utf-8 -*-
import
import
#定义处理类型
class IndexHandler(tHandler):
#添加⼀个处理get请求⽅式的⽅法
def get(lf):
#向响应中,添加数据
('好看的⽪囊千篇⼀律,有趣的灵魂万⾥挑⼀。')
if __name__ == '__main__':
#创建⼀个应⽤对象
app = ation([(r'/',IndexHandler)])
#绑定⼀个监听端⼝
(8888)
#启动web程序,开始监听端⼝的连接
t().start()
1 .在pycharm中直接运⾏代码
2 .如果是在ub沙姜鸡脚 untu,在命令窗⼝输⼊
python ⽂件名.py
使⽤浏览器访问
o 代码解析
1.⼊门程序代码解析
:tornado的基础web框架
RequestHandler
:封装对请求处理的所有信息和处理⽅法
get/post/..
:封装对应的请求⽅式
write()
:封装响应信息,写响应信息的⼀个⽅法
:核⼼io循环模块,封装linux的epoll和BSD的kqueue, tornado⾼性能处理的核⼼。
current()
返回当前线程的IOLoop实例对象
start()
启动IOLoop实⼒对象的IO循环,开启监听
rver底层处理
httprver监听端⼝
rver(app)
(port)
httprver实现多进程操作
rver(app)
(port)
(0/None/<0/num)
# -*- coding:utf-8 -*-
from import Application,RequestHandler
from import IOLoop
from rver import HTTPServer
class IndexHandler(RequestHandler):
def get(lf):
('给⾃⼰⼀点时间,理清所有的荒唐与期望。')
if __name__ == '__main__':
app = Application([(r'/',IndexHandler)])
http_rver = HTTPServer(app)
#最原始的⽅式
http_(8888)
http_(0)
#启动Ioloop轮循监听
t().start()
同时打开两个窗⼝测试发现实现了多进程
s配置
全局配置
(
name, default, type, multiple, help
)
命令⾏参数转换
_command_line()
#-*- coding:utf-8 -*-
from import RequestHandler,Application
from import IOLoop
from rver import HTTPServer
import s
#定义变量
('port',default=8000,type=int,help="this is the port >for application")
class IndexHandler(RequestHandler):
def get(lf):
('我们既然改变不了规则,那就做到最好')
if __name__ == '__main__':
app = Application([(r'/',IndexHandler)])
_command_line()
http_rver = HTTPServer(app)
http_()
http_(1)
#启动IOLoop轮循监听
t().start()
通过命令窗⼝输⼊port来访问
通过使⽤我们命令窗⼝设定的port进⾏访问
配置⽂件
#即在当前py⽂件⽬录创建config⽂件,并在py代码中加⼊以下代码,
_config_file("./config")
配置模块:跟配置⽂件类似
ation配置
程序调试之debug配置
#⾃动重启+取消缓存模板+取消缓存静态⽂件+提供追踪信息
ation([(..)], debug=True)
注:开发之初可以设置debug=True⽅便调试,开发完毕改为Fal.
路由信息初始化参数配置
ation([(r””, Handler, {k:v})])
def initialize(lf, k)
#-*- coding:utf-8 -*-
from import RequestHandler,Application
from import IOLoop
from rver import HTTPServer
from s import define,options
define('port',default=8000,type=int)
class IndexHandler(RequestHandler):
def get(lf):
('get-->先⾃沉稳,⽽后爱⼈')
class ArticleHandler(RequestHandler):
def initialize(lf,title):
print('-->initialize()')
= title
def get(lf):
('你正在查看⽂章:%s'% )
if __name__ == '__main__':
_command_line()
app = Application([(r'/',IndexHandler),(r'/article',ArticleHandler,{'title':'你>希望⾃⼰成为什么样的⼈,最终就会成为那样的⼈。'})],debug=True)
http_rver = HTTPServer(app)
http_()
http_(1)
t().start()
输⼊路径,显⽰结果
路由名称设置及反解析
#名称设置
ation([
url(r””, handler, {k,v}, name=“”)
])
#反解析操作
rever_url创业计划书格式 (name)
# -*- coding:utf-8 -*-
from import Application, RequestHandler, url
from import IOLoop
from rver import HTTPServer
from s import options,define
de和春节有关的画 fine("port", default=8000, type=int)
class IndexHandler(RequestHandler):
def get(lf):
class RegistHandler(RequestHandler):
def initialize(lf, title):
= title
def get(lf):
("注册业务处理:" + str())
class LoginHandler(RequestHandler):
def get(lf):
("⽤户登录页⾯展⽰")
def post(lf):
("⽤户登录功能处理")
if __name__ == "__main__":
app = Application(
[
(r"/", IndexHandler),
(r"/regist", RegistHandler, {"title": "会员注册"}),
url(r"/login", LoginHandler, name="login"),
]
)
http_rver = HTTPServer(app)
http_(8000)
t().start()
浏览器显⽰结果
5.参数传递
get⽅式传递参数
get_query_arguments(name,default=_ARG_DEFAULT,strip=True)
get_query_argu千岛湖是哪里 ment(name ,strip=True)
# -*- coding:utf-8 -*-
from import Application, RequestHandler
from import IOLoop
from rver import HTTPServer
from s import options, define
define("port", default=8000, type=int)
class IndexHandler(RequestHandler):
def get(lf):
# 获取get⽅式传递的参数
urname = _query_argument("urname")
urnames = _query_arguments("urname")
print (urname)
print (urnames)
if __name__ == "__mai万象更新拼音 n__":
app = Applicat紫檀功效 ion([(r"/", IndexHandler)])
(8000)
t().start()
post⽅式传递参数
get_body_arguments(name, default=_ARG_DEFAULT,strip=True)
get_body_argument(name ,strip=True)
混合⽅式
get_arguments(..)/get_argument(..)
# -*- coding:utf-8 -*-
from import Application, RequestHandler
from import IOLoop
from s import options, define
define("port", default=8000, type=int)
class IndexHandler(RequestHandler):
def get(lf):
# 获取get⽅式的参数
ur = _argument("ur")
print("get⽅式获取参数:" + str(ur))
def post(lf):
# 获取post⽅式的参数
ur = _argument译的组词 ("ur")
print("post⽅式获取参数:" + ("utf-8"))
if __name__ == "__main__":
app = Application([(r"/", IndexHandler)])
(8888)
t().start()
使⽤⾕歌浏览器的应⽤postman可以看到get和post请求
其他参数
通过request获取参数数据
method/host/uri/path/query/version/headers/body/remote_ip/files
6.响应头设置
t_header(name, value)
t_default_headers(lf)
add_header(name, value)
clear_header(name)
# -*- coding:utf-8 -*-
from import Application, RequestHandler
from import IOLoop
from s import options,汇报材料模板 define
define("port", default=8000, type=int)
class IndexHandler(RequestHandler):
def t_default_headers(lf):
# 第⼆种响应头设置⽅式
print("---------> 响应头t_default_headers()执⾏")
_header("Content-type", "application/json; chart=utf-8")
_header("js", "zj")
def get(lf):
# 第⼀种操作响应头的⽅式:
# _header("Content-type", "application/json")
print("---------->get⽅法执⾏")
("{'简书':'知⼏'}")
_header("jianshu", "zhiji")
if __name__ == "__main__":
app =依据英语 Application([(r"/", IndexHandler)])
(8000)
t().start()
浏览器显⽰结果
操作
cooki革命乐观主义精神 es
t/get_cookie(name, value)
t/get_cure_cookie(name, value)
clear_cookie(name)
clear_all_cookie()
# -*- coding:utf-8 -*-
from import Application, RequestHandler
from import IOLoop
from s import options, define
define("port", default=8000, type=int)
class IndexHandler(RequestHandler):
def get(lf):
("hello ")
_cookie("loginur", "admin")
print _cookie("loginur")
print s
if __name__ == "__main__":
app = Application([(r"/", IndexHandler)])
(8000)
t().start()
可以看到cookie已⽣效
8.响应错误码 & 错误描述
t_status(status_code, reason=None)
# -*- coding:utf-8 -*-
from import Application, RequestHandler
from import IOLoop
from s import options, define
define("port", default=8000, type=int)
class IndexHandler(RequestHandler):
def get(lf):
("hello 简书")
# _status(404) # 标准错误码 ⽆描述使⽤默认描述
_status(201, reason="zhiji is cool") # ⾃定义错误码,设置reason描述
# _status(230) # ⾃定义错误码,⽆reason 报错
if __name__ == "__main__":
app = Application([(r"/", IndexHandler)])
(8000)
t().start()
通过审查元素我们可以测试定义的错误码有没有⽣效
nd_error(status_code, reason=None)
# -*- coding:utf-8 -*-
from import Application, RequestHandler
from import IOLoop
from s import options, define
define("port", default=8000, type=int)
class IndexHandler(RequestHandler):
def get(lf):
("hello ")
_error(500, reason="出错啦出错啦")
if __name__ == "__main__":
app = Application([(r"/", IndexHandler)])
(8000)
t().start()
浏览器显⽰结果
write_error(lf, status_code, **kw)
# -*- coding:utf-8 -*-
from import Application, RequestHandler
from import IOLoop
from s import options, define
define("port", default=8000, type=int)
class IndexHandler(RequestHandler):
def get(lf):
("hello ")
_error(404, msg="页⾯丢失", info="家⾥服务器搞对象去了")
def write_error(lf, status_code, **kwargs):
("出错啦,⼯程师MM正在赶来的途中...")
("错误信息:%s
" % kwargs["msg"])("错误描述:%s
" % kwargs["info"])if __name__ == "__main__":
app = Application([(r"/", IndexHandler)])
(8000)
t().start()
浏览器显⽰结果
本文发布于:2023-04-25 22:54:45,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/89/848096.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |