2011-08-12 14 views
0

私のGoogle App Engine django-nonrelプロジェクトでChannel APIを使用しようとしています。私の現在の要件として、特定のページにいるすべてのユーザーリスト(例:group_mainpage.html)を、同じページにいる他のすべてのユーザーに送信したいとします。言い換えれば、もし我々が両方ともこのページにいれば、私たちはどちらもこのページの角のどこかに名前を見ることができます。ユーザーがページから移動すると、その名前をリストから削除する必要があります。しかし、JSONを正しく作って表示することができません。今まで私はこのように行っているが、それは働いていない:Google App Engine Channel APIのsimplejsonダンプ

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 %} 

EDIT:

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) 
+2

あなたはそれが機能していないと言いましたが、何が起こっているのですか?エラーが出ていますか?データはちょうどよく見えませんか?詳細が役立ちます。 – Herms

+0

こんにちはHerms、私が得ているエラーは、 '0x9e3688cでのはJSONシリアライズ可能ではありません' – SRC

答えて

0

channel_msg=simplejson.dumps(outstr)は、HTMLではなくJSON配列を送信するために使用する必要があります。

このお試しください:

for result in data: 
     user_list+=result.user_name 
:また、私はあなたの結果ループに '+ =' 不足していると思います

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

:JavaScriptコードで

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

、その後に

+0

こんにちはKevin、answer.Butのためにありがとうございます。私のエラー '0x9e3688cでのはJSONのシリアライズ可能ではありません。 – SRC

0

いくつかの試行錯誤のプロセスの後、私は方法を見つけることができました、そして、それは今のところ働くようです。私はそれが最善のアプローチかどうかわかりません。私は変更を反映するようにコードを編集しています。

+0

要件に応じて柔軟性を増すことができる、考慮すべきもう1つのアプローチは、2つの方法です。 Channel APIメッセージの一部としてhtmlを送信するのではなく、メッセージを使用して要素の(JavaScriptの)リフレッシュをトリガーします(事実上、ビューアを2つのハンドラに分割することができます。リスト要素)。 –

+0

@ケビン:あなたの提案に感謝ケビン。しかし、私はあなたが何を示唆しているかを確信していません。あなたはアプローチのための小さなサンプルコード/リンクがありますか。あなたの時間をもう一度歓迎します。 – SRC

+0

または私のスニペットを更新できますか? – SRC