在Tornado
中支持兩種路由系統, 正則路由系統以及二級域名路由系統. javascript
# 默認路由系統, 根據url的不容調用不一樣的類
application = tornado.web.Application([
(r"/index/(?P<page>\d*)", home.IndexHandle),
], **settings)
#二級路由匹配
application.add_handlers("test.ming.com",[
(r"/index/(?P<page>\d*)", home.IndexHandle)
])複製代碼
(r"/index/(?P<page>\d*)", home.IndexHandle)
這裏咱們訪問時候須要以相似http://127.0.0.1/index/2
的方式訪問, 在get
或者post
接受處理請求的函數應有page
參數來接受訪問地址最後的整數(咱們稍後將根據這個作一個分頁的demo
)test.ming.com
的域名)接下來咱們使用基於正則的路由系統來實現網頁分頁功能.css
all.py
文件以下: html
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#利用全局變量模擬數據庫全部內容
USER_LIST= [
{'username': 'test', 'email': 'test@163.com'}
]
#利用循環生成多條數據來模擬大量數據依次便於實現分頁效果
for i in range(300):
tmp = {'username': "test - " + str(i), 'email': str(i) + "@vip.com"}
USER_LIST.append(tmp)複製代碼
pager.py
文件以下: java
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 單獨用於實現分頁功能的類
class Page:
# current_page表示當前頁數, all_item表示總的數據條目
# 初始化時候將當前頁數current_page與總頁數all_page加入到對象中
def __init__(self, current_page, all_item):
# all_page表示總頁數, 每頁顯示5條數據, more表示餘數, 若是大於0則表示應多加一頁才能顯示完全部的數據
all_page, more = divmod(all_item, 5)
if more > 0:
all_page += 1
self.all_page = all_page
# 捕捉異常, 防止傳入非法字符冒充頁數, 一旦發生異常則直接將當前頁current_page設置爲1, 表示默認顯示第一頁
try:
current_page = int(current_page)
except Exception as e:
current_page = 1
# 若是前傳入的頁數小於1, 則直接默認爲第一頁
if current_page < 1:
current_page = 1
self.current_page = current_page
# 根據當前頁在每一個頁面顯示11個頁碼, 此處是開始頁碼
@property
def start_page(self):
return (self.current_page - 1) * 5
# 結束頁碼
@property
def end_page(self):
return self.current_page * 5
# 顯示的頁碼對應的html字符串, base_url表示可定製的url跳轉路徑
def page_str(self, base_url):
# 定義list_page列表用來暫時存儲全部的頁碼字符串
list_page = []
# 若是總頁數小於11頁, 則直接顯示全部頁數
if self.all_page < 11:
s = 0
e = self.all_page
# 總頁數大於11頁時候
else:
# 當前頁數小於6則直接顯示1到11頁
if self.current_page <= 6:
s = 1
e = 11
# 當前頁數大於6頁時候
else:
# 當前頁加上5也以後就大於總頁數則直接顯示倒數11頁
if self.current_page + 5 > self.all_page:
s = self.all_page - 10
e = self.all_page
# 當前頁數大於6頁而且加上5頁並不超過總頁數時候, 顯示當前頁先後5頁以及當前頁
else:
s = self.current_page - 5
e = self.current_page + 5
# 首頁設置
first_page = '<a href="/%s/1">首頁</a>' % (base_url)
list_page.append(first_page)
# 上一頁設置
# 當前頁小於等於第一頁時候, 點擊上一頁不作任何操做(這裏理論上是不會有小於的狀況)
if self.current_page <= 1:
pre_page = '<a href="javascript:void(0);">上一頁</a>'
# 當前頁大於第一頁, 點擊上一頁則直接跳轉到上一頁
else:
pre_page = '<a href="/%s/%s">上一頁</a>' % (base_url, self.current_page - 1)
list_page.append(pre_page)
# 根據上邊條件過濾後的頁碼起始位置s以及頁碼終止位置e來生成對應的11條頁碼對應的html字符串
for p in range(s, e + 1):
if p == self.current_page:
tmp = '<a class="active" href="/index/%s">%s</a>' % (p, p)
else:
tmp = '<a href="/%s/%s">%s</a>' % (base_url, p, p)
list_page.append(tmp)
# 下一頁設置
# 下一頁要大於或者等於最大頁數時候, 不作任何操做
if self.current_page >= self.all_page:
next_page = '<a href="javascript:void(0);">下一頁</a>'
else:
next_page = '<a href="/%s/%s">下一頁</a>' % (base_url, self.current_page + 1)
list_page.append(next_page)
# 尾頁設置
last_page = '<a href="/%s/%s">尾頁</a>' % (base_url, self.all_page)
list_page.append(last_page)
# 頁面跳轉
jump_page = """<input type="text" /><a onclick='JumpTo("%s",this)'>GO</a>""" % base_url
# 頁面跳轉的js代碼, 本質就是location.href的使用
jspt = """<script> function JumpTo(base_url,th){ var val=th.previousElementSibling.value; if(val.trim().length>0){ location.href="/"+base_url+"/"+val } } </script>"""
list_page.append(jump_page)
list_page.append(jspt)
return "".join(list_page)複製代碼
home.py
文件以下: python
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.web
from commons.all import USER_LIST
from commons.pager import Page
class IndexHandle(tornado.web.RequestHandler):
def get(self, c_page):
# c_page表示url傳遞過來的當前頁數, len(USER_LIST)表示總共有多少條數據
pg = Page(c_page, len(USER_LIST))
#開始頁數
start = pg.start_page
#尾頁
end = pg.end_page
#當前顯示的數據片斷
current_list = USER_LIST[start:end]
#傳入index並返回對應的下面分頁部分的html代碼
str_page = pg.page_str('index')
#將當前顯示的數據片斷, 當前頁數以及分頁的html代碼返回給瀏覽器
self.render('index.html', list_info=current_list, current_page=pg.current_page, str_page=str_page)
def post(self, c_page):
#獲取傳入的username的值
username = self.get_argument('username', None)
#獲取傳入的email的值
email = self.get_argument("email", None)
#生成臨時的字典對象, 表示一個完整的數據片斷
tmp = {'username': username, 'email': email}
#將該數據片斷加入的全局變量USER_LIST, 這裏用全局變量模擬數據庫獲取的數據
USER_LIST.append(tmp)
self.redirect('/index/' + c_page)複製代碼
index.html
文件以下: web
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style> .pager a{ display: inline-block; padding: 5px; margin: 3px; background-color: aquamarine; } .pager a.active { background-color: crimson; color: aliceblue; } </style>
</head>
<body>
<h1>提交數據</h1>
<form method="post" action="/index/{{current_page}}">
<input name="username" type="text">
<input name="email" type="text">
<input type="submit" value="提交">
</form>
<h1>顯示數據</h1>
<table border="1">
<thead>
<tr>
<th>用戶名</th>
<th>郵箱</th>
</tr>
</thead>
<tbody>
{%for tmp in list_info%}
<tr>
<td>{{tmp['username']}}</td>
<td>{{tmp['email']}}</td>
</tr>
{%end%}
</tbody>
</table>
<div class="pager">
<!--加raw 以此來直接執行原始的字符串, 不作轉義-->
{%raw str_page%}
</div>
</body>
</html>複製代碼
start.py
文件以下: 數據庫
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.web,tornado.ioloop
from controllers import home
if __name__ == '__main__':
settings = {
# 模板路徑配置
'template_path': 'views',
}
application = tornado.web.Application([
(r"/index/(?P<c_page>\d*)", home.IndexHandle),
], **settings)
application.listen(80)
tornado.ioloop.IOLoop.instance().start()複製代碼
html
字符串, 而後將這些字符串返回給瀏覽器直接渲染顯示