Je n'arrive pas à comprendre comment utiliser les résultats de la requête. J'ai posé une demi-douzaine de questions à ce sujet mais je ne comprends toujours pas. Je copie du code précédent et je le fais fonctionner d'une manière ou d'une autre mais puisque je ne comprends pas le concept sous-jacent le code tombe en panne si je fais un changement mineur. J'apprécierais vraiment si vous pouviez me dire comment vous visualisez ce qui se passe ici et si vous me l'expliquez. Je vous remercie.IndexError: index de liste hors limites (dans les résultats de la requête)
class ReceiveEmail(InboundMailHandler):
def receive(self, message):
logging.info("Received email from %s" % message.sender)
plaintext = message.bodies(content_type='text/plain')
for text in plaintext:
txtmsg = ""
txtmsg = text[1].decode()
logging.info("Body is %s" % txtmsg)
logging.info("CC email is %s" % ((message.cc).split(",")[1]))
query = User.all()
query.filter("userEmail =", ((message.cc).split(",")[1]))
results = query.fetch(1)
for result in results:
result.userScore += 1
um = results[0]
um.userScore = result.userScore
um.put()
Dans ce code, si je comprends bien, la requête prend la deuxième adresse e-mail dans la liste cc et va chercher le résultat.
J'incrémenter le userScore par 1.
Ensuite, je veux mettre à jour cet objet Datastore je le dis
um = results[0]
um.userScore = result.userScore
um.put()
Mais ce qui donne un indice sur la plage Erreur:
um = results[0]
IndexError: list index out of range
Pourquoi? J'imagine que results[0]
est l'élément zeroeth des résultats. Pourquoi est-il hors de portée? La seule chose que je peux penser est que, la liste peut être None
. Mais je ne comprends pas pourquoi. Il doit avoir le 1 objet qui a été récupéré.
De plus, si je tente de tester pour la première adresse e-mail en changeant l'index de [1] à [0]
query.filter("userEmail =", ((message.cc).split(",")[0]))
alors je ne suis pas le IndexError
.
Qu'est-ce que je fais mal ici?
Merci!
EDIT
Voir les commentaires:
(message.cc).split(",")[0])
laissé un espace devant les e-mails (en commençant par le second e-mail), de sorte que la requête n'a pas été les jumelant;
>>> cc.split(",")
['[email protected]', ' [email protected]', ' [email protected]']
ajouter un espace après la virgule fixe le problème:
>>> listcc = cc.split(", ")
>>> listcc
['[email protected]', '[email protected]', '[email protected]']
>>>
Comment êtes-vous sûr qu'il y a des résultats à chercher en premier lieu? –
Oui, bonne question. J'envoie un e-mail depuis le champ Dev Console Inbound Mail with cc qui contient 'user11 @ example.com' et' cc777 @ example.com'. Je m'assure que ces 2 emails sont déjà dans la base de données afin que la requête puisse les récupérer. Mais je viens d'essayer à nouveau ni index 0 ni 1 fonctionne maintenant. Pouvez-vous suggérer des moyens de vérifier ce que la requête voit? Merci. – Zeynel
@Ignacio Vazquez-Abrams: Vous avez peut-être raison; la requête semble échouer: si les résultats: pour aboutir à des résultats: result.userScore + = 1 um = résultats [0] = um.userScore result.userScore um.put() autre: logging.info ("requête a échoué") – Zeynel