Domanda

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

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

quindi dovrei essere in grado di renderlo un job cron, ma quando provo io ottenere un 405 da l'accesso di questo codice che volte su se provo a correre 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='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')

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

Grazie

È stato utile?

Soluzione

Sono venuto da GAE / J-terra, in modo da non ho familiarità con Python, ma aveva incontrato la risposta 405 dalla mia lavoratore TaskQueue service prima. Nel mio caso, è dovuta a causa di impostare il metodo di TaskOption POST mentre la costruzione della Task, mentre il mio gestore serve solo richieste GET.

EDIT: Dopo aver verificato la 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 sarebbe di specificare in modo esplicito che utilizza il vostro compito metodo GET invece di POST, o cambiare il metodo gestito del vostro gestore in POST invece di GET.

Altri suggerimenti

Voglio solo aggiungere uno scenario possibile, in quanto una rapida ricerca di " TaskQueue service 405 " tutti finisce in questa pagina:

ho ottenuto 405 errori, perché non ha specificato un parametro di "target". taskqueue.add() finisce aggiungendo compito al target di default, dove i miei gestori sono su un modulo backend separata.

Se il target non è specificato, allora compiti vengono richiamati sulla stessa versione l'applicazione in cui sono stati accodati. Quindi, se si accodato un compito dalla versione dell'applicazione di default senza specificare un bersaglio sulla coda, il compito viene richiamato nella versione applicazione predefinita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top