使用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))
内容版权声明:除非注明,否则皆为本站原创文章。
转载注明出处:https://sulao.cn/post/549
评论列表