首页 > flask处理字典排序问题

flask处理字典排序问题

背景:

一个简单选库查询功能:
   页面如下:
  

由于我查询的时候是顺序查询,即为一个个查询后插入到一个字典中在返回到页面,在服务端字典用了collections.OrderedDict处理了,直接服务端打印出来可以正常排序,但是到了页面就不正常排序了。

服务端部分代码:

if commandform.validate_on_submit():
        session['cmdsql'] = commandform.command.data
        session['serverID'] = request.form.getlist('dbcheckbox')
        #判断是否选服
        if session.get('serverID') == []:
            flash(u'未选游戏服,请勾选游戏服!')
            return redirect(url_for('ow.owsql'))
        session['indexsql'] = {}
        for db in session.get('serverID'):
            dbsql = OwGame.query.filter_by(serverId=db).first()
            dbhost = dbsql.serverHost
            dbname = dbsql.serverName
            session['dbname'] = dbname
            session['sqlres'] = runSql(dbhost=dbhost,serverid=db,sql=session.get('cmdsql'))
            session.get('indexsql')[db] = session.get('sqlres')
        flash(u'查询数据库完成')
        session['sqldic'] = collections.OrderedDict(sorted(session.get('indexsql').items(),key=lambda t:t[0]))
        for k,v in session.get('sqldic').items():
            print k,v
        return redirect(url_for('ow.owsql'))
    return render_template('ow/owsql.html',
                           commandform=commandform,
                           cmdsql = session.get('cmdsql'),
                           serverlists=serverlists,
                           dbname = session.get('dbname'),
                           sqldic = session.get('sqldic')
                           )

前端显示代码:

<div class="panel-body">
                    <h4 style="color: darkblue">执行的语句:{{ cmdsql }}</h4>
                    {% if sqldic %}
                    {% for key,value in sqldic.items() %}
                    <br><br>
                    <P style="color: red">查询 OW_{{ key }} 服的数据:</P>
                        {% if value %}
                            {% for sql in  value %}
                            <p>**************** {{ loop.index }}. row *****************<br>
                                {% for i in sql %}
                                    {{ i }}:{{ sql[i] }}</p>
                                {% endfor %}
                            {% endfor %}
                        {% else %}
                            <p>Empty set (0.00 sec).</p>
                        {% endif %}
                    {% endfor %}
                    {% endif %}

                    </div>

服务端执行查询的结果:
即为这段执行结果:

for k,v in session.get('sqldic').items():
            print k,v
1 [{'propValue': '1452646877013', 'propKey': 'SERVER_OPEN_TIME'}]
2 [{'propValue': '1455759457445', 'propKey': 'SERVER_OPEN_TIME'}]
3 [{'propValue': '1456475863972', 'propKey': 'SERVER_OPEN_TIME'}]
4 [{'propValue': '1457161447282', 'propKey': 'SERVER_OPEN_TIME'}]
5 [{'propValue': '1457938848417', 'propKey': 'SERVER_OPEN_TIME'}]
6 [{'propValue': '1459333976715', 'propKey': 'SERVER_OPEN_TIME'}]
7 [{'propValue': '1460715839991', 'propKey': 'SERVER_OPEN_TIME'}]
8 [{'propValue': '1461139426796', 'propKey': 'SERVER_OPEN_TIME'}]

前端显示结果:

没有正常排序,这要怎么处理的?

上周改了,清缓存后还是有问题。


首先,字典是无序的集合,列表才是有序的,所以你的问题应该改成 python处理列表排序问题 。然而你查出来的数据每个列表只有一个元素,所以并没有顺序的问题。其实你的问题是查出来的每个列表之间的排序问题。这个看你的代码貌似看不出什么端倪


没理由啊,Jinja2官方文档就说了可以用collections.OrderedDict来做有序字典的,而且我自己试验也是正确的

from jinja2 import Template
from collections import OrderedDict

template = Template('{% for key, value in dic.items() %}{{key}}={{value}}  {% endfor %}!')

dic = OrderedDict()
#dic = dict()

dic['a'] = 1
dic['b'] = 2
dic['c'] = 3
dic['d'] = 4
dic['e'] = 5

for i in dic.iteritems():
    print(i)

html = template.render(dic=dic)
print(html)

问题应该出在orderdict到模板的过程中,按我的理解,orderdict在py里是有序的,但是输出到模板里,可能转化为一般的无序dict了,所以要排序,还是用回list比较靠谱

【热门文章】
【热门文章】