2010-10-06 5 views
4

J'ai une application (développée en python) qui nécessite une vue actualisée depuis le magasin de données toutes les 5 secondes. Je suis sorti avec une fonction javascript et gérer l'actualisation en utilisant ajax.Actualisation de Google App Engine-Ajax à partir de la banque de données en utilisant python

Ajax fonction

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.0/jquery.min.js"></script>  <script type="text/javascript">    var refreshId = setInterval(function()   {   $('#responsecontainer').fadeOut("slow").load('/refresh').fadeIn("slow");   }, 5000);  </script> 

Après quoi, j'ai un ensemble de balises div (de responsecontainer) qui fermaient les paramètres renvoyés du côté serveur pour l'affichage. Mon code côté serveur consiste à interroger le magasin de données et à restituer le résultat dans le fichier de modèle (index.html).

class RefreshPage(webapp.RequestHandler): 
    def get(self): 
    greetings_query = Greeting.all().order('-date') 
    greetings = greetings_query.fetch(10) 

    if users.get_current_user(): 
     url = users.create_logout_url(self.request.uri) 
     url_linktext = 'Logout' 
    else: 
     url = users.create_login_url(self.request.uri) 
     url_linktext = 'Login' 

    template_values = { 
     'greetings': greetings, 
     'url': url, 
     'url_linktext': url_linktext, 
     } 

    path = os.path.join(os.path.dirname(__file__), 'index.html') 
    self.response.out.write(template.render(path, {})) 

Cependant, quand je lance l'application, les résultats se sont rafraîchies en même temps que le contenu html comme les formulaires et les tableaux. Ensemble, je vois 2 formulaires après l'index.html rafraîchi par lui-même toutes les 5 secondes.

Quelqu'un peut-il me guider sur la cause possible et la solution?

Répondre

8

L'appel à load('/refresh') remplace le contenu du div responsecontainer par le code HTML chargé.

Vous avez donc besoin du gestionnaire RefreshPage pour retourner simplement ce code HTML, et non la page entière. Par exemple, il faut utiliser un modèle qui contient ceci:

{% for greeting in greetings %} 
    {% if greeting.author %} 
    <b>{{ greeting.author.nickname }}</b> wrote: 
    <a href="/sign?key={{ greeting.key.id }}&auth={{ greeting.author.nickname }}">Delete</a> 
    {% else %} 
    An anonymous person wrote: 
    {% endif %} 
    <blockquote>{{ greeting.content|escape }}</blockquote> 
{% endfor %} 

Pour éviter de reproduire ce contenu dans les deux modèles, vous pourriez potentiellement faire de votre modèle principal comprend ce sous-modèle à l'intérieur du div, par exemple:

<div id="responsecontainer"> 
    {% include "sub_template.html" %} 
</div> 

<form action="/sign" method="post"> 
<div><textarea name="content" rows="3" cols="60"></textarea></div> 
<div><input type="submit" value="Sign Guestbook" name="submitGuestBk"></div> 
</form> 
Questions connexes