【tornado建站】实现博客分页及页面展示
首先需要实现的是博客分页展示,每一页十篇博文,然后点击每一篇的标题就进入到该博文,这里十篇博文也写入到config.py文件中去。
class WebConfig:
items_page = 10
然后写前端的代码:
{% for index,entry in enumerate(entrys) %}
<h2><a href="/entry/{{entry}}" target="_blank">{{entry_title}}</a></h2>
<h3>{{entry_date}}</h3>
<p>{{entry_content}}</p>
<hr />
{% end %}
这样就解析了后端会传入的博文列表,当然,entry_title、entry_date、entry_content这里只是伪代码,先实现了后端代码再来更新这一部分。
后端就拓展前几遍文章中已经定义好的PageHandler类,并且构造一个分割页数的函数:
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), "scripts"))
# 因为将除了website.py外的所有脚本都放到了scripts中
# 所以需要添加路径才能import数据库脚本及config脚本
import run_mysql
import config
def cut_pages(page_index, page_type):
# 这里先传入一个page_type
# 因为考虑到后面添加搜索功能是也需要分割页面
if re.findall('[a-z]{2}\d+', page_index):
# 这里是将博客路径规划为两个字母加数据
# 比如建站相关的第一页就定为/jz0,第二页为/jz1
# 爬虫相关的第一页就是/pc0...
m = re.findall('([a-z]{2})(\d+)', page_index)[0]
tags, pages = m
results = run_mysql.main("find_data", "one", "TAG", tags)
else:
print("wrong with page index")
sys.exit(0)
new_results = []
page_infos = []
results.reverse() # 反向 记录靠前的排在最后
for idx, result in enumerate(results):
if idx % config.WebConfig.items_page == 0:
new_results.append([])
page_infos.append("/%s/%s%d" % (page_type, tags, (idx / config.WebConfig.items_page)))
new_results[-1].append(result)
results = new_results[int(pages)]
for x in range(0, len(results)):
# 截取前三行
tmp_line = "\\n".join(results[x][3].split("\\n")[:3])
results[x][3] = tmp_line.replace("<p>", "").replace("</p>", "") + "..."
return results, pages, page_infos
class PageHandler(tornado.web.RequestHandler):
def get(self, page_index):
if re.findall('[a-z]{2}\d+', page_index):
results, pages, page_infos = cut_pages(page_index, "blog")
self.render('blog_title.html', entrys=results, page_num=int(pages), page_infos=page_infos)
else:
raise tornado.web.HTTPError(404)
这样就实现了分页,然后就可以将前端的代码完善:
{% for index,entry in enumerate(entrys) %}
<h2><a href="/entry/{{entry[0]}}" target="_blank">{{entry[1]}}</a></h2>
<h3>{{entry[2]}}</h3>
<p>{{entry[3]}}</p>
<hr />
{% end %}
然后需要添加前端的翻页功能,这里需要第一页的时候隐藏Prev这个按钮,最后一页时隐藏Next按钮,为了避免过长,当超过当前页面十页的按钮就不显示出来了:
{% if page_num == 0 %}
<li><span class="button disabled">Prev</span></li>
{% else %}
<li><a href="{{page_infos[page_num-1]}}" class="button">Prev</a></li>
{% end %}
{% for idx, page_info in enumerate(page_infos) %}
{% if page_num == idx %}
<li><a href="{{page_info}}" class="page active">{{page_num+1}}</a></li>
{% elif abs(page_num-idx) > 10 %}
{% continue %}
{% else %}
<li><a href="{{page_info}}" class="page">{{idx+1}}</a></li>
{% end %}
{% end %}
{% if page_num == len(page_infos)-1 %}
<li><span class="button disabled">Next</span></li>
{% else %}
<li><a href="{{page_infos[page_num+1]}}" class="button">Next</a></li>
{% end %}
然后就完成了分页,然后随便将每一篇博客的展示就比较简单了。先补充类:
class EntryHandler(tornado.web.RequestHandler):
def get(self, entry_index):
try:
entry = run_mysql.main("find_data", "one", "name_id", entry_index)
self.render('blog.html', entrys=entry[0])
except:
raise tornado.web.HTTPError(404)
然后把内容放到页面中去:
<header class="main">
<h2>{{entrys[1]}}</h2>
<h3>{{entrys[2]}}</h3>
</header>
<h2><a href=\"/entry/{{entrys[0]}}\"></a></h2>
<!-- 这里加上raw是因为数据库中存的是html格式,所以需要原样式输出 -->
{% raw entrys[3] %}
<hr />
这样博客的框架也就完成了。