Tornado基礎
Tornado概述
Python常用后端框架:?
Flask: 輕量級,需要使用大量插件,自由靈活
? Django: 重量級,不需要太多插件,沒那么靈活
Tornado: 主要特點:①可以實作長連接Websocket, ②可以實作高并發
Python的Web框架種類繁多(比Python語言的關鍵字還要多),但在眾多優秀的Web框架中,Tornado框架最適合用來開發需要處理長連接和應對高并發的Web應用,Tornado框架在設計之初就考慮到性能問題,它可以處理大量的并發連接,更輕松的應對C10K(萬級并發)問題,是非常理想的實時通信Web框架,
Tornado框架源于FriendFeed網站,在FriendFeed網站被Facebook收購之后得以開源,正式發布的日期是2009年9月10日,Tornado能讓你能夠快速開發高速的Web應用,如果你想撰寫一個可擴展的社交應用、實時分析引擎,或RESTful API,那么Tornado框架就是很好的選擇,Tornado其實不僅僅是一個Web開發的框架,它還是一個高性能的事件驅動網路訪問引擎,內置了高性能的HTTP服務器和客戶端(支持同步和異步請求),同時還對WebSocket提供了完美的支持,
了解和學習Tornado最好的資料就是它的官方檔案,在tornadoweb.org上面有很多不錯的例子,你也可以在Github上找到Tornado的源代碼和歷史版本,
5分鐘上手Tornado
-
安裝Tornado,
pip install tornado -
撰寫Web應用: example01.py,
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write('<h1>Hello, world!</h1>') def main(): app = tornado.web.Application(handlers=[(r'/', MainHandler), ]) app.listen(8888) tornado.ioloop.IOLoop.current().start() if name == 'main': main() -
運行并訪問應用,
python example01.py
使用命令列引數動態設定埠
import tornado.ioloop
import tornado.web
from tornado.options import define, options, parse_command_line
# 定義默認埠
define('port', default=8000, type=int)
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write('<h1>Hello, world!</h1>')
def main():
# python example01.py --port=8888
parse_command_line()
app = tornado.web.Application(handlers=[(r'/', MainHandler), ])
app.listen(options.port)
tornado.ioloop.IOLoop.current().start()
if __name__ == '__main__':
main()
在啟動Web應用時,如果沒有指定埠,將使用define函式中設定的默認埠8000,如果要指定埠,可以使用下面的方式來啟動Web應用,
python example01.py --port=8888
路由決議
上面我們曾經提到過創建Application實體時需要指定handlers引數,這個引數非常重要,它應該是一個元組的串列,元組中的第一個元素是正則運算式,它用于匹配用戶請求的資源路徑;第二個元素是RequestHandler的子類,在剛才的例子中,我們只在handlers串列中放置了一個元組,事實上我們可以放置多個元組來匹配不同的請求(資源路徑),而且可以使用正則運算式的捕獲組來獲取匹配的內容并將其作為引數傳入到get、post這些方法中,
import os
import random
import tornado.ioloop
import tornado.web
from tornado.options import define, options, parse_command_line
# 定義默認埠
define('port', default=8000, type=int)
class DaysHandler(tornado.web.RequestHandler):
# def get(self, year, month, day):
def get(self, month, day, year):
self.write('%s年%s月%s日' % (year, month, day))
class Days2Handler(tornado.web.RequestHandler):
# def get(self, year, month, day):
def get(self, month, year, day):
self.write('%s年%s月%s日' % (year, month, day))
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.render('index.html')
def main():
"""主函式"""
parse_command_line()
app = tornado.web.Application(
# handlers是按串列中的順序依次進行匹配的
handlers=[
(r'/days/(\d{4})/(\d+)/(\d{2})/', DaysHandler),
(r'/days2/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/', Days2Handler),
],
template_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),'templates'),
)
app.listen(options.port)
tornado.ioloop.IOLoop.current().start()
if __name__ == '__main__':
main()
模板頁index.html,
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Tornado基礎</title>
</head>
<body>
<h1>{{message}}</h1>
</body>
</html>
請求處理器RequestHandler
RequestHandler是處理用戶請求的核心類,通過重寫get、post、put、delete等方法可以處理不同型別的HTTP請求,除了這些方法之外,RequestHandler還實作了很多重要的方法,下面是部分方法的串列:
-
get_argument/get_arguments/get_body_argument/get_body_arguments/get_query_arugment/get_query_arguments:獲取請求引數, -
set_status/send_error:操作狀態碼和回應頭, -
write/flush/finish/:輸出相關的方法, -
render/render_string:渲染模板, -
redirect:請求重定向, -
get_cookie/set_cookie/clear_cookie/clear_all_cookies:操作Cookie, -
reverse_url: url反向決議redirect(reverse_url(’’))
類似Flask中的url_for:
? ①可以加載static靜態檔案, {{ url_for(‘static’, filename=‘css/index.css’) }}
? ②反向決議:在視圖函式中redirect(url_for(‘藍圖名.視圖函式名’)),
? 在模板中 < a href="{{ url_for(‘藍圖名.視圖函式名’) }}">登錄< /a >
Tornado中:
? ①加載static靜態檔案: {{ static_url(‘css/index.css’) }}
? ②反向決議: 在視圖函式中 redirect(reverse_url(’’))
? 在模板中 < a href="{{ reverse_url(’’) }}"> 登錄 < /a >
登錄功能
# 登錄驗證,并設定cookie
class UserHander(tornado.web.RequestHandler):
def get(self):
username = self.get_query_argument('username')
password = self.get_query_argument('password')
if username == 'hule' and password == '123456':
self.set_cookie('username',username,expires_days=7)
self.redirect('/index/')
else:
self.write('登錄失敗')
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{{ reverse_url('u_handler') }}">
用戶名:<input type="text" name="username">
password:<input type="text" name="password">
<input type="submit" value="登錄">
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--<link rel="stylesheet" href="/static/index.css">-->
<link rel="stylesheet" href="{{ static_url('index.css')}}">
</head>
<body>
<h3>index</h3>
<p>{{ message }}</p>
{% if username %}
<p>{{username}}</p>
{% end %}
<a href="{{ reverse_url('login') }}">登錄</a>
</body>
</html>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/248102.html
標籤:python
