【问题标题】:simplejson dumps in Google App Engine Channel APIGoogle App Engine Channel API 中的 simplejson 转储
【发布时间】:2011-08-12 20:21:05
【问题描述】:

我正在尝试将Channel API 与我的 Google App Engine django-nonrel 项目一起使用。根据我目前的要求,我想将某个页面上的所有用户列表(比如group_mainpage.html)发送给同一页面上的所有其他用户。换句话说,如果我们都在这个页面上,我们都可以在这个页面的某个角落看到我们的名字。一旦用户离开页面,他们的名字应该从列表中删除。但我无法正确制作 JSON 并显示它。到目前为止,我已经这样做了,但它不起作用:

group_mainpage.html

<html>
    <head>
    </head>
    <body>
        <div id="channel_api_params" style="display:none;" chat_token="{{chat_token}}" channel_id="{{channel_id}}"></div>
        <div align="center"><font size="5" color="blue">Welcome To Group Main Page</font><br><br>
        </div>
        <div align="center">
            <form method="POST" action="/group_start/">
                <input type='submit' value="Start">
            </form>
            <div id="mydiv">
            {% include 'user_list.html' %}
            </div>
        </div>
        <script type="text/javascript" src="/media/jquery.js"></script>
        <script type="text/javascript" src="/_ah/channel/jsapi"></script>
        <script type="text/javascript">
        $(document).ready(function(){
            $(window).load(function(){
                var channel_id = $('#channel_api_params').attr('channel_id');
                $.ajax({
                    url: '/valid_group_users/',
                    type: 'GET',
                    data:{
                        'channel_id':channel_id,
                    },
                    success: function(current_user){
                    },
                    complete: function(){
                    }
                });

                var chat_token = $('#channel_api_params').attr('chat_token');
                var channel = new goog.appengine.Channel(chat_token);
                var socket = channel.open();
                socket.onopen = function(){
                };
                socket.onmessage = function(m){
                    var data = $.parseJSON(m.data);
                    $('#mydiv').append(data['post_element']);
                };
                socket.onerror =  function(err){
                    alert("Error => "+err.description);
                };
                socket.onclose =  function(){
                    alert("channel closed");
                };

            });
        });
        </script>
    </body>
</html>

views.py

def valid_group_users(request):
    channel_id=request.GET['channel_id']

    group_initialise=Group_initialise()
    group_initialise.channel_id=channel_id
    group_initialise.user_name=request.user
    group_initialise.save()

    try:
        data=Group_initialise.objects.all()
    except:
        pass

#As per the suggestions of Kevin:
user_list=[]
for result in data:
    user_list.append(result.user_name)
    template_values={'user_list':user_list}
temp_result={'post_element':render_to_response("user_list.html",template_values)}

channel_msg=simplejson.dumps(temp_result)

for result in data:
    if result.user_name!=request.user:
        channel.send_message(result.channel_id,channel_msg)

user_list.html

{% for users in user_list %}
    <div class="message">
        <span>
            {{users}}:
        </span>
    </div>
{% endfor %}

编辑:

temp_result=str(temp_result)
#To remove Http-Header/content-type copy string after 40 characters
temp_result=temp_result[40:]
#Replace colon attaching automatically at the end of every user_name
temp_result=temp_result.replace(':','')
channel_msg=simplejson.dumps(temp_result)

【问题讨论】:

  • 您说它不起作用,但是发生了什么?你有错误吗?数据看起来不对?更多细节会有所帮助。
  • 你好 Herms,我得到的错误是' is not JSON serializable'

标签: python django google-app-engine channel-api


【解决方案1】:

channel_msg=simplejson.dumps(outstr) 应该用于发送 JSON 数组,而不是 HTML。

试试这个:

outstr={'page_element':render_to_response("user_list.html",template_values)}

然后在你的 JavaScript 代码中:

$('#mydiv').append(data['page_element']);

另外,我认为您的结果循环中缺少“+=”:

for result in data:
        user_list+=result.user_name

【讨论】:

  • 凯文你好,谢谢你的回答。但它不起作用。它给了我错误' is not JSON serializable'。
【解决方案2】:

经过一些试错过程,我设法找到了一种方法,目前似乎可行。我不知道这是否是最好的方法。我已经编辑了代码以反映我现在正在工作的更改。

【讨论】:

  • 另一种可以考虑的方法,它可能会给您更多的灵活性,具体取决于您的要求,它是一种两条腿的方法。即不是将 html 作为 Channel API 消息的一部分发送,而是使用消息来触发元素的(javascript)刷新(有效地允许您将 views.py 拆分为两个处理程序 - 一个用于触发事件,一个用于呈现用户列表元素)。
  • @Kevin:感谢 Kevin 的建议。但我不确定我是否得到你的建议。您是否有该方法的任何小示例代码/链接。再次感谢您的时间。
猜你喜欢
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 2011-09-06
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多