【tornado建站】实现博客分页及页面展示

【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 />

这样博客的框架也就完成了。

上一篇:使用JDBC在MySQL数据库中快速批量插入数据


下一篇:堆排序啊啊啊啊啊