随着网站内容的增加 在单个页面上显示所有的数据浏览速度会变慢且不符合实际需求,内容越多web浏览器需要花费大量的时间下载并渲染内容页面,降低用于访问质量。解决方法是进行分页显示数据。

 

app.py

    --forms.py

from flask_wtf import form
from wtforms import TextAreaField
from wtfforms.validators import DateRequired
class PostForm(form):
   body = TextAreaField('撰写文章',validators=[DateRequired()])

app.py

    --views.py

from app import auth
from app.models import Post
from app import db
@auth.route('/',methods=['GET','POST'])
def index():
    form = PostForm()
    if form.validate_on_submit():
       post = Post(body=form.body.data,users=current_user._get_current_object())
       db.session.add(post)
       return redirect(url_for('main.index'))
    
    # 指定渲染的页数
    page = request.args.get('page', 1, type=int)
     #  pagination是salalchemy的方法,第一个参数:当前页数,per_pages:显示多少条内容 error_out:True 请求页数超出范围返回404错误 False:反之返回一个空列表
    pagination = Post.query.order_by(Post.timestamp.desc()).pagination(page, per_page=current_app.config['FLASK_POST_PRE_ARGV'], error_out=False)
     # 返回一个内容对象
    posts = pagination.items
     return render_template('index.html', form=form, posts=posts)

        

app.py

    --models.py

class Post(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer,primary_key=True)
    body = db.Column(db.Text)
    timestamp = db.Column(db.DateTime,index=True,default=datetime.utcnow)
    users_id = db.Column(db.Integer,db.ForeignKey('users.id'))

    

app.py

    --templates.py

         --index.html

{% extends "base.html" %}
{% import "_macors_pagination.html as macros" %}
{%block title %}撰写文章{% endblock %}
{% block page_content %}
  {{ macros.pagination.widget(pagination, 'main.index') }}
{% endblock %}


#  定义分页模板的宏

app.py

    --templates.py

         --_macors_pagination.html

{% macro pagination_widget(pagination, endpoint) %}
 <ul class="pagination">
     <li{% if not pagination.has_prev %} class="disabled"{% endif %}>
         <a href="{% if pagination.has_prev %}{{ url_for(endpoint, page=pagination.page - 1, **kwargs) }}{% else %}#{% endif %}">
          &laquo;
      </a>
    </li>
   {% for p in pagination.iter_pages() %}
       {% if p %}
        {% if p == pagination.page %}
           <li class="active"><a href="{{ url_for(endpoint, page=p, **kwargs) }}">{{ p }}</a></li>
        {% else %}
           <li><a href="{{ url_for(endpoint, page=p, **kwargs) }}">{{ p }}</a></li>
        {% endif %}
     {% endif %}
   {% endfor %}
    <li{% if not pagination.has_next %} class="disabled"{% endif %}>
         <a href="{% if pagination.has_next %}{{ url_for(endpoint, page=pagination.page + 1, **kwargs) }}{% else %}#{% endif %}">
        &raquo;
       </a>
    </li>
 </ul>
{% endmacro %}

flask 分页对象属性

属性
说明
items
当前显示页面的内容
query
分页源查询
page
当前的页数
prev_num
上一页的页数
next_num
下一页的页数
has_prev
如果有上一页,返回True
has_next
如果有下一页,返回True
pages
得到总的页数
per_page
per_pages 每页显示多少条内容


最终显示结果:

wKioL1h2_-ySZ80_AABQTpOxRHw399.png-wh_50


题外:

    回到家乡工作最现实的问题是专业不对口,不能说城市需求少,只能怪自己知识面窄吧。老家呢只能算4线城市吧,生活节奏比较慢,大多人对网络需求比较少 上班工资低 做六休一、不签合同 没有五险一金,改变吧,所以想着自己接点活做点什么,想来想去还是做网页,看过一段时间php 又对比了下python tornado flask 框架 最终还是选择flask,原因:1、会点python 2、文档齐全 3、需求少能做网页管他用什么做 当然选择自己熟悉的。