2010-10-24 3 views
1

J'essaie de patcher un framework de test construit en python pour javascript appelé mootools-test-runner (je suis un développeur frontal par jour, donc mes compétences python sont assez faible ... vraiment faible.)Répondre à httpRequest après avoir utilisé threading.Timer pour retarder la réponse

Le cas d'utilisation est que nous voulons être en mesure de faire une demande de JSON au serveur et avoir un délai x temps avant son retour - à l'origine, il a été écrit pour utiliser un méthode de sommeil, mais cela a empêché plusieurs demandes simultanées. Sooo ... après avoir farfouillé pendant environ un jour je suis arrivé au code ci-dessous. Le problème que je vois (bien qu'il pourrait bien y avoir beaucoup de problèmes avec mon code) est:

La vue test_runner.views.echo_json n'a pas retourné un objet HttpResponse.

si quelqu'un pouvait offrir des conseils ou me diriger dans la bonne direction, je serais très reconnaissant - merci!

def echo_json(req, wasDelayed=False): 
    if req.REQUEST.get('delay') and wasDelayed == False: 
     sleeper(req, echo_jsonp) 
    else: 
     response = {} 
     callback = req.REQUEST.get('callback', False) 
     noresponse_eys = ['callback', 'delay'] 
     for key, value in req.REQUEST.items(): 
      if key not in noresponse_keys: 
       response.update({key: value}) 

     response = simplejson.dumps(response) 

     if callback: 
      response = '%s(%s);' % (callback, response) 

     return HttpResponse(response, mimetype='application/javascript') 

def sleeper(req, callback) 
    delay = float(req.REQUEST.get('delay')) 
    t = threading.Timer(delay, functools.partial(callback, req, true)) 
    t.start() 
+0

Veuillez ajouter votre framework Python aux tags. –

+0

oh désolé, merci :) – jacobthornton

Répondre

0

Êtes-vous sûr de vouloir la déclaration return dans la boucle for key, value? Vous n'autorisez qu'une seule itération et revenez.

Vérifiez également le déroulement de la fonction. Il y a des cas dans lesquels il retournera None. La façon la plus simple d'y parvenir est d'imprimer votre objet de requête et de l'examiner dans les cas où la fonction ne renvoie pas d'objet HttpResponse.

Voir que votre fonction retourne None si:

  • req.request contient est vrai
  • req.REQUEST.items() et wasDelayed le 'retard' clé est vide

Je ne peux pas être sûr, mais je pense que les 2 problèmes sont le else: et le return là. Le code situé sous le else: ne devrait-il pas être exécuté, que la réponse soit retardée ou non? Et la déclaration de retour ne devrait-elle pas être en dehors de la boucle for?

+0

Oui, il semble que vous avez une indentation supplémentaire sur cette ligne de retour. Essayez d'en déduire un arrêt. –

+0

L'autre exécute le même code dans une sorte de boucle de sommeil étrange. Une façon plus standard de le faire serait avec un certain temps. –

+0

le retour à l'intérieur de la boucle for était une erreur de pâte de copie - désolé à ce sujet. merci pour votre aide – jacobthornton

Questions connexes