使用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前端框架的翻页效果
当使用mongo的ObjectId来找数据时会无法找到数据,我们在python中接收到这个ObjectId需要对其进行处理以后才可用
from bson.objectid import ObjectId #对其进行实例化 objectId = ObjectId(str(XXXXXXXXXXXXXXXXXXXXX))