6

voglio risolvere una stato di 405 che ricevo dalla coda compito quando si cerca di generare un report:Stato 405 dalla coda compito

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 

Il codice che crea il compito è

class CreateReportHandler(webapp2.RequestHandler): 

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

e l'ho indirizzato con webapp2:

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

allora dovrei essere in grado di rendere un job cron, ma quando prova che ottengo A 405 dalla accesso di questo codice che volte su se provo a lanciarlo direttamente:

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') 

Come posso risolvere lo stato 405 e ottenere attraverso l'esecuzione?

Grazie

risposta

14

mi è venuto da GAE/J-terra, in modo da non ho familiarità con Python, ma avevo incontrato 405 risposta dal mio lavoratore TaskQueue service prima. Nel mio caso, ciò è dovuto all'impostazione del metodo TaskOption su POST durante la creazione dello Task, mentre il gestore gestisce solo le richieste GET.

EDIT: Dopo aver controllato l'TaskQueue.add() docs, sembra che il metodo predefinito utilizzato se il metodo non è specificato (come nel tuo esempio di codice) è POST, mentre il vostro gestore sembra solo in grado di servire le richieste GET.

Il mio suggerimento dovrebbe specificare esplicitamente che l'attività utilizza il metodo GET anziché il POST o che modifica il metodo gestito del gestore in POST anziché GET.

+2

Grazie, ho scoperto che era lo stesso per me - stava facendo un 'POST' HTTP invece di un' GET' –

1

Voglio solo aggiungere uno degli scenari possibili in quanto una rapida ricerca di "TaskQueue service 405" tutto finisce in questa pagina:

ho ottenuto 405 errori, perché non ha specificato un parametro di "target". taskqueue.add() termina l'aggiunta di attività alla destinazione predefinita, in cui i miei gestori si trovano su un modulo back-end separato.

Se la destinazione non è specificata, le attività vengono invocate sulla stessa versione dell'applicazione in cui sono state accodate. Pertanto, se si accodava un'attività dalla versione dell'applicazione predefinita senza specificare una destinazione sulla coda, l'attività viene richiamata nella versione dell'applicazione predefinita.

Problemi correlati