6

Quiero resolver un estado 405 que recibo de la cola de tareas cuando se trata de generar un informe:Estado 405 de la cola de tareas

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 

El código que crea la tarea es

class CreateReportHandler(webapp2.RequestHandler): 

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

y tengo que transiten con webapp2:

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

entonces yo debería ser capaz de hacer que una tarea programada pero cuando lo pruebo me sale a 405 desde el acceso de este Código, que el tiempo de espera si trato de ejecutarlo directamente:

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='[email protected]', 
            subject='Report %s %s' % (user.firstname, user.lastname)) 
        message.body = 'Here is the monthly report' 
        message.to = '[email protected]' 
        message.bcc = '[email protected]' 
        message.attachments = ['report.pdf', asset.data] 
        message.send() 
        logging.info('message sent') 

¿Cómo puedo resolver el estado 405 y obtener a través de la ejecución?

Gracias

Respuesta

14

Vine de GAE/J-tierra, así que no estoy familiarizado con Python, pero me había encontrado 405 respuesta de mi trabajador TaskQueue antes. En mi caso, se debe a que se configuró el método TaskOption en POST al construir el Task, mientras que mi controlador solo atiende GET solicitudes.

EDITAR: después de marcar TaskQueue.add() docs, parece que el método predeterminado utilizado si el método no está especificado (como en el ejemplo del código) es POST, mientras que su controlador parece que solo puede atender solicitudes GET.

Mi sugerencia sería especificar explícitamente que su tarea utiliza el método GET en lugar de POST, o cambiar el método manejado de su controlador en POST en lugar de GET.

+2

Gracias, descubrí que era lo mismo para mí: estaba haciendo un http 'POST' en lugar de un' GET' –

1

Sólo quiero añadir una hipótesis posible ya que una búsqueda rápida de "TaskQueue 405" todo termina en esta página:

que tiene 405 errores, porque no ha especificado un parámetro "objetivo". taskqueue.add() termina agregando tareas al objetivo predeterminado, donde mis manejadores están en un módulo de back-end separado.

Si el destino no está especificado, las tareas se invocan en la misma versión de la aplicación donde se pusieron en cola. Por lo tanto, si encola una tarea desde la versión de la aplicación predeterminada sin especificar un destino en la cola, la tarea se invoca en la versión de la aplicación predeterminada.

Cuestiones relacionadas