Question

Je veux résoudre un état 405 que je reçois de la file d'attente des tâches lorsque vous essayez de générer un rapport:

2012-02-16 03:56:53.012 /report/ 405 3ms 0kb AppEngine-Google; (+http://code.google.com/appengine)

2012-02-16 03:56:53.007 /createreport/ 302 20ms 0kb Mozilla/5.0 (X11; Linux x86_64; rv:2.0) Gecko/20100101 Firefox/4.0
I 2012-02-16 03:56:52.990 creating report task

Le code qui crée la tâche est

class CreateReportHandler(webapp2.RequestHandler):

    def get(self):
        logging.info('creating report task')
        taskqueue.add(url=r'/report/')
        self.redirect('/')

et je l'ai dirigé avec webapp2:

Route(r'/createreport/', handler=CreateReportHandler, name='createreport'),

alors je devrais être en mesure de faire une tâche cron, mais quand je le tester j'obtenir un 405 de l'accès de ce code qui fois si je tente de l'exécuter directement:

class Report(webapp2.RequestHandler):

    def get(self):
        # Create a conversion request from HTML to PDF.
        users = User.query()
        today = date.today()
        startdate = date(today.year, today.month, 1) # first day of month   
        html = None     
        for user in users: 
            if user.activity() > 0:
                logging.info('found active user %s %s' % (user.firstname, user.lastname))
                html = '<html><body><table border="1">'
                html = html + '<tr><td>ORDER</td><td colspan="2">----DISTRIBUTOR----</td><td>ORDER</td><td>Silver</td><td>%</td><td>Total</td><td>Bonus</td></tr>'
                level = user.level()
                distributor = user
                while distributor.has_downline():
                    downline = User.query(User.sponsor == distributor.key).order(User.lastname).fetch()
                    for person in downline:  # to this for whole downline
                        orders = model.Order.all().filter('distributor_id =' , person.key.id()).filter('created >' , startdate).filter('status =', 'PAID').fetch(999999)
                        silver = 0
                        name = person.firstname +' '+ person.lastname
                        for order in orders:
                            logging.info('found orders')
                            for idx,item in enumerate(order.items):
                                purchase = model.Item.get_by_id(long(item.id()))
                                amount = int(order.amounts[idx])
                                silver = silver + amount*purchase.silver/1000.000 
                            if len(name) > 13:
                                name = name[13]
                            html = html + '<tr><td>' + str(order.created.date().day)+'/'+ str(order.created.date().month )+'</td><td>' + filters.makeid(person.key.id()) +'</td><td>' + name + '</td><td>' + str(order.key().id()) + '</td><td>' + str(silver) 
                            dist_level = order.dist_level
                            bonus = 0   
                            if level == 5 and dist_level == 4:                          
                                bonus = 0.05
                            if level == 5 and dist_level == 3:
                                bonus = 0.1
                            if level == 5 and dist_level == 2:
                                bonus = 0.13
                            if level == 5 and dist_level == 1:
                                bonus = 0.35

                            if level == 4 and dist_level == 3:                          
                                bonus = 0.05
                            if level == 4 and dist_level == 2:
                                bonus = 0.08
                            if level == 4 and dist_level == 1:
                                bonus = 0.3

                            if level == 3 and dist_level == 2:                          
                                bonus = 0.03
                            if level == 3 and dist_level == 1:
                                bonus = 0.25

                            if level == 2 and dist_level == 1:                          
                                bonus = 0.2

                            html = html + '</td><td>' + str(bonus) + '</td><td>' + str(order.total)
                            bonusmoney = bonus * float(order.total)
                            html = html + '</td><td>' + str(bonusmoney) + '</td></tr>'

                        distributor = person

                html = html + '</table>'

            asset = conversion.Asset("text/html", html, "test.html")
            conversion_obj = conversion.Conversion(asset, "application/pdf")        
            rpc = conversion.create_rpc()
            conversion.make_convert_call(rpc, conversion_obj)

            result = rpc.get_result()
            if result.assets:
                for asset in result.assets:
                    logging.info('emailing report')# to %s' % user.email)
                    message = mail.EmailMessage(sender='noreply@bnano.se',
                                    subject='Report %s %s' % (user.firstname, user.lastname))
                    message.body = 'Here is the monthly report'
                    message.to = 'niklasro@gmail.com'
                    message.bcc = 'fridge@koolbusiness.com'
                    message.attachments = ['report.pdf', asset.data]
                    message.send()
                    logging.info('message sent')

Comment puis-je résoudre le statut 405 et passer à travers l'exécution?

Merci

Était-ce utile?

La solution

Je suis venu de GAE / J-terre, donc je ne suis pas familier avec Python, mais je l'avais rencontré une réponse 405 de mon travailleur TaskQueue avant. Dans mon cas, il est causé du fait de régler la méthode de TaskOption à POST pendant la construction du Task, alors que mon gestionnaire ne sert que les demandes GET.

EDIT: Après avoir vérifié la TaskQueue.add () docs , il apparaît que la méthode par défaut utilisée si la méthode n'est pas spécifiée (comme dans votre exemple de code) est POST, alors que votre gestionnaire ne semble en mesure de répondre aux requêtes GET.

Ma suggestion serait préciser explicitement que vos utilisations de travail au lieu de la méthode GET POST, ou modifier la méthode traitée de votre gestionnaire en POST au lieu de GET.

Autres conseils

Je veux juste ajouter un scénario possible depuis une recherche rapide de " TaskQueue 405 " toutes les extrémités vers le haut dans cette page:

Je suis 405 erreurs car ne spécifiait pas un paramètre « cible ». taskqueue.add() finit par ajouter la tâche à la cible par défaut, où mes gestionnaires sont sur un module de back-end séparé.

Si la cible est non spécifiée, alors les tâches sont appelées sur la même version de l'application où ils ont été en file d'attente. Donc, si vous un en file d'attente tâche à partir de la version de l'application par défaut sans spécifier une cible sur la file d'attente, la tâche est invoquée dans la version de l'application par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top