Flask中使用pymongo操作mongodb和分页显示数据

使用pymongo操作mongodb非常简单,同时mongo内置的limit+skip命令组合可以简化我们代码中的分页,例如我通过url传参将页面变量p传入查询语句,就可以轻松做到分页,同时使用pymongo操作mongodb的代码基本和原生命令差不多

安装pymongo比较简单,直接pip进行安装即可

pip install pymongo

然后我操作mongo的方法代码是这样

from flask import Flask,render_template,request,jsonify
from pymongo import MongoClient
from  page import get_page
import math
app = Flask(__name__)

@tools.route('/serby', methods=['POST','GET'])
def serby():
    p = request.args.get('p')
    show_status = 0
    if not p:
        p = 1
    else:
        p = int(p)
        if p > 1:
            show_status = 1

    limit_start = (p-1)*10
    client = MongoClient(host=getServerIp(), port=getMongoPort())
    db = client[getMongoDbName()]
    coll = db['man']
    result = coll.find({ "id":{"$gte": 0} }).sort([("timestamp",-1)]).limit(10).skip(limit_start)
    '''总页数'''
    total = coll.find({ "id":{ "$gte": 0} }).count()
    page_total = int(math.ceil(total/10))
    page_list = get_page(page_total, p)
    datas = {
        'data_list' : result,
        'p' : p,
        'page_total' : page_total,
        'show_status' : show_status,
        'page_list' : page_list
    }
    return render_template('serby.html', datas=datas)

以上代码有一个地方踩坑(上面代码已经修正),那就是我们在代码中使用sort进行排序的时候,它会抛出一个报错给我们

TypeError: if no direction is specified, key_or_list must be an instance of list

原因是在python中操作mongodb只能使用列表进行排序,而不能使用字典进行排序,我们只需要这样改改

sort({"timestamp":-1})
改为
sort([("timestamp",-1)])

然后就是分页方法

def get_page(total,p):
    show_page = 5   # 显示的页码数
    pageoffset = 2  # 偏移量
    start = 1    #分页条开始
    end = total  #分页条结束

    if total > show_page:
        if p > pageoffset:
            start = p - pageoffset
            if total > p + pageoffset:
                end = p + pageoffset
            else:
                end = total
        else:
            start = 1
            if total > show_page:
                end = show_page
            else:
                end = total
        if p + pageoffset > total:
            start = start - (p + pageoffset - end)
    #用于模版中循环
    dic = range(start, end + 1)
    return dic

最后是我的前端代码

<div class="layui-page">
    <ul class="pagination">
    {% if datas.show_status == 1 %}
        <li><a href="{{ url_for('advtools.serby') }}?p=1">首页</a></li>
        <li><a href="{{ url_for('advtools.serby') }}?p={{ datas.p-1 }}">上一页</a></li>
    {% endif %}
    {% for li in datas.page_list %}
        {% if li == datas.p %}
        <li class="active"><span>{{ li }}</span></li>
        {% else %}
        <li><a href="{{ url_for('advtools.serby')}}?p={{ li }}">{{ li }}</a></li>
        {% endif %}
    {% endfor %}
    {% if datas.p < datas.page_total %}
        <li class=''><a href="{{ url_for('advtools.serby')}}?p={{ datas.p+1 }}">下一页</a></li>
        <li class=''><a href="{{ url_for('advtools.serby')}}?p={{ datas.page_total }}">尾页</a></li>
    {%endif%}
    </ul>
</div>

最够上效果,使用layui前端框架的翻页效果

menu.saveimg.savepath20180920150758.jpg

当使用mongo的ObjectId来找数据时会无法找到数据,我们在python中接收到这个ObjectId需要对其进行处理以后才可用

from bson.objectid import ObjectId
#对其进行实例化
objectId = ObjectId(str(XXXXXXXXXXXXXXXXXXXXX))


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/552.html

评论

  1. 访客

    访客 回复

    2021-05-07 01:36:02

    advtools是指什么

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。