1.Tornado简介
Tornado是一种轻量级 Web 服务器软件的开源版本。
Tornado 和主流Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
得利于其非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。
1.基础app文件
因为这是Python的一个第三方库,所以需要 pip 安装
from tornado import web, ioloop, httpserver
class UploadHandler(web.RequestHandler):
def get(self, *args, **kwargs):
self.render('upload.html')
定义 get 方法,指定返回模板文件
class RegisterHandler(web.RequestHandler):
def get(self, *args, **kwargs):
self.render('register.html')
def post(self, *args, **kwargs):
username = self.get_argument('username')
realname = self.get_argument('realname')
通过前端关键字获取前端输入框内容
进行前后端数据交互
settings = {'template_path': 'template',
'static_path': 'static'}
设置模板文件以及静态文件路径
application = web.Application([
(r'/upload/', UploadHandler),
(r'/register', RegisterHandler),
], **settings)
定义路由并将setting配置引入
if __name__ == '__main__':
http_server = httpserver.HTTPServer(application)
http_server.listen(8888)
ioloop.IOLoop.current().start()
设置 8888 为默认端口号
启动网站请求
前端表单
<body>
<h1>注册用户</h1>
<video width="300" height="200"></video>
<canvas width="300" height="200"></canvas>
<form action="/register" method="post">
<p><input type="text" placeholder="请输入用户名" name="username"></p>
<p><input type="text" placeholder="请输入真实姓名" name="realname"></p>
<p><input type="submit" value="注册"></p>
</form>
</body>
2.文件上传
对路由及对应类名称进行相应修改,如上图 upload 路由
前端代码----upload.html
<body>
<form action="/upload/" method="post" enctype="multipart/form-data">
<input type="file" name="img1"/>
<input type="submit" value="图片上传"/>
</form>
</body>
后端接口
def post(self, *args, **kwargs):
# 获取文件/图片,为字典格式
img1 = self.request.files.get('img1')
for img in img1:
body = img.get('body', '')
content_type = img.get('content_type', '')
filename = img.get('filename', '')
# 设置文件路径,上传到本地 files 目录
dir = os.path.join(os.getcwd(), 'files', filename)
with open(dir, 'wb') as f:
f.write(body)
# 设置请求头为图片格式并使图片在浏览器显示
不设置则显示乱码
self.set_header('Content-Type', content_type)
self.write(body)
如此则在本地写入上传文件
并且上传后返回到此文件页面
3.重定向
class IndexHandler(web.RequestHandler):
def get(self, *args, **kwargs):
self.redirect('http://www.baidu.com')
使用 redirect 方法实现
当然也可以自定义实现
self.set_header('Location', 'http://www.4399.com')
self.set_status(301)
设置永久重定向,以后访问此路由都将跳转
设置暂时重定向 302 ,建议设置 302,除非路由永久不变
4.路由逆向访问
视图如此定义
class IndexHandler(web.RequestHandler):
def get(self, *args, **kwargs):
self.redirect(self.reverse_url('test'))
根据名称寻找路由
路由如此定义
application = web.Application([
(r'/upload/', UploadHandler),
URLSpec(r'/register', RegisterHandler, name='test'),
(r'/l/', IndexHandler),
], **settings)
需导入 URLSpec ,流程如下
先访问 l 路由,进入IndexHandler 视图,
根据 name 逆向匹配路由 register
进入 RegisterHandler 视图
5.设置 Cookie
1.非加密方式
self.set_cookie('name', 'li', expires_days=3)
设置 cookie key value 存活时间
self.get_cookie('name')
获取 cookie
在浏览器 Request中 可看到
2.加密方式
在 settings 里加入盐值
'cookie_secret': 'abc'
设置和显示
self.set_secure_cookie('name', 'li', expires_days=1)
name = self.get_secure_cookie('name')
self.write(name)
在浏览器处能看到加密的 cookie
直接获取的是密文, 如上获取明文
6.Django设置cookie和session
cookie 用户登录成功后设置和获取
response = HttpResponse('...') / redirect('...') 创建响应对象
response.set_cookie('name', 'li')
request.COOKIES.get('name')
session 简单
request.session['name']='li'
request.session.get('name')
7.Tornado异步服务器
通过装饰器, yield关键字挂起以及回调函数完成
8.Tornado异步客户端
回调函数完成