• Tornado 概述


    Tornado 概述


    1 基本概念


    像其他web框架一样, tornado也包括了以下内容:

    基本构成:
    
    	a 路由系统
    
    	b 视图 
    
    		获取请求数据
    		返回数据
    
    	c 模板语言
    		模板基本使用
    		自定义函数
    
    	利用组件自己完成 分页, 中间件等扩展功能 
    

    概念

    Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。

    这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。


    特点

    Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

    得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接。

    	对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。
    

    开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题,请参阅 C10K problem。)


    2 简单应用


    (1) 登录页面的小实例

    	import tornado.ioloop
    	import tornado.web
    	
    	
    	class LoginHandler(tornado.web.RequestHandler):
    		def get(self):
    			self.render('login.html')  # 渲染template
    	
    	
    	settings = {
    			'template_path':'templates',
    			'static_path':'static',      
    			'static_url_prefix':'/stat/',   # 静态文件 url    
    	}
    	
    	
    	# 配置模板文件路径
    	
    	application = tornado.web.Application(
    		[(r"/login",LoginHandler),],**settings  # 配置文件
    		)
    	
    	
    	if __name__ == '__main__':
    			# 创建socket对象
    		application.listen(8001)
    			# conn,add = socket.accept()
    		tornado.ioloop.IOLoop.instance().start()
    	
    
    	# 1 执行脚本,监听 8000 端口
    	
    	# 2 浏览器客户端访问 /index  -->  http://127.0.0.1:8000/index
    	
    	# 3 服务器接受请求,并交由对应的类处理该请求
    	
    	# 4 类接受到请求之后,根据请求方式(post / get / delete ...)的不同调用并执行相应的方法
    	
    	# 5 方法返回值的字符串内容发送浏览器
    

    像Django中的

    	{% load static from staticfiles %}
    	{% static 'main.css'% } 
    

    flask中

    	{{url_for('static',filename='main.css')}}
    

    tornado 也支持 静态文件的反向查找

    	{{static_url('main.css')}}
    


    (2) csrf 配置

    settings = {
     'xsrf_cookies':True
    }
    
    {% raw xsrf_from_html() %} # 使用
    

    (3) 请求数据

    self.get_query_argument('page') # get params数据
    
    self.get_body_argument('username') # post form数据
    
    self.get_argument('username')
    self.get_argument('page')   #  所有数据都可以获取
    
    
    	def post(self):
    		usrname = self.get_argument('username')
    		pwd = self.get_argument('pwd')
    		print(usrname,pwd)
    		if usrname == 'root' and  pwd == '123':
    			self.redirect('http://google.com')
    			return
    
    		self.write('post')
    

    (4) 模板语言

    	self.render('login.html',**{'msg':'用户密码有误'})
    	self.render('index.html',user_list=user_list,user_dict=user_dict)
    
    
    python 语法:
    
    	{{msg}}  #注意: msg为空,在后端也得声明 msg = ''
    	
    	<ul>
    		{% for item in user_list %}	
    			<li>{{item}}</li>
    		{% end %}
    	</ul>
    		{{ user_list[0] }}
    
    		{{ user_dict['id'] }}
    		{{ user_dict.get('name') }}
    

    (5) cookie设置

    **普通cookie**
    
    	self.set_cookie('user',username)
    	self.get_cookie('user')
    
    **加密cookie**
    
    	设置 settings = {
    		'cookie_secret':'salt'
    	}
    
    	self.set_secure_cookie('user',username)
    	self.get_secure_cookie('user',username)
    

    代码实例:

    	import tornado.ioloop
    	import tornado.web
    	
    	
    	class LoginHandler(tornado.web.RequestHandler):
    		def get(self):
    			self.render('login.html',msg='')  # 渲染template
    	
    		def post(self):
    			username = self.get_argument('username')
    			pwd = self.get_argument('pwd')
    			if username == 'root' and  pwd == '123':
    				self.set_cookie('user',username)
    				self.redirect('/index')
    				return
    	
    			self.render('login.html',**{'msg':'用户密码有误'})
    	
    	
    	
    	class IndexHandler(tornado.web.RequestHandler):
    		def get(self):
    	
    			if self.get_cookie('user'):
    				user_list = [
    					'james','kobe'
    				]
    	
    				user_dict = {
    				'id':1,'name':'cp3'
    				}
    				self.render('index.html',user_list=user_list,user_dict=user_dict)
    				return  # 直接 return 返回(推荐写法)
    			self.redirect('/login')
    	
    	
    	settings = {
    			'template_path':'templates',
    			'static_path':'static',      
    			'static_url_prefix':'/stat/',   # 静态文件 url 
    			# 'xsrf_cookies':True,   # csrf 
    	
    	}
    	
    	
    	# 配置模板文件路径
    	
    	application = tornado.web.Application([
    		(r"/login",LoginHandler),
    		(r"/index",IndexHandler),
    	
    		],**settings  # 配置文件
    		)
    	
    	
    	if __name__ == '__main__':
    		# 创建socket对象
    		application.listen(8000)
    		# conn,add = socket.accept()
    		tornado.ioloop.IOLoop.instance().start()
    

    (6) 通过tornado请求入口,在请求处理前,封装一些数据

    class AuthHandler(tornado.web.RequestHandler):
    
    	def initialize(self):
    		self.username = self.get_secure_cookie('user')
    		# 初始化的时候
    
    	def prepare(self):
    		pass 
    		# 执行_excute 方法
    
    
    class LoginHandler(AuthHandler):
    	
    	# @cookie_auth 判断self.username 是否有值
    	def get...
    		if self.username:(当然这里的判断 可以通过装饰来实现)
    			...
  • 相关阅读:
    ZT:POI操作PPT
    ADO.NET 2.0 Dataset和Datatable 新功能新特性
    ADO.NET 2.0 大批量数据操作和多个动态的结果集
    浏览.NET Framework 2.0 类型库中新增的常用功能
    ASP.NET程序中常用代码汇总(四)
    保存div与页面滚动条的位置
    在ASP.NET中实现AJAX
    ASP.NET 2.0中隐藏listbox的某一项
    泛型最佳实践C#
    ASP.NET 2.0 验证控件新的功能
  • 原文地址:https://www.cnblogs.com/big-handsome-guy/p/8640400.html
Copyright © 2020-2023  润新知