Frage

Ich möchte einen Status 405 beheben, den ich aus der Task -Warteschlange bekomme, wenn ich versuche, einen Bericht zu generieren:

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

Der Code, der die Aufgabe erstellt, ist

class CreateReportHandler(webapp2.RequestHandler):

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

Und ich habe es mit WebApp2 geleitet:

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

Dann sollte ich in der Lage sein, es zu einem Cron -Job zu machen, aber wenn ich es testet, bekomme ich einen 405 vom Zugriff dieses Codes, was ausfällt, wenn ich versuche, ihn direkt auszuführen:

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

Wie kann ich den Status 405 lösen und die Ausführung durchstehen?

Vielen Dank

War es hilfreich?

Lösung

Ich kam aus GAE/J-Land, also bin ich mit Python nicht vertraut, aber ich war begegnet 405 Antwort von meinem TaskQueue -Arbeiter zuvor. In meinem Fall ist es aufgrund der Einstellung der Einstellung der TaskOption Methode an POST Beim Aufbau der Task, während mein Handler nur dient GET Anfragen.

Bearbeiten: Nachdem Sie das überprüft haben TaskQueue.add () docs, Es sieht so aus,

Mein Vorschlag wäre ausdrücklich festzustellen, dass Ihre Aufgabe die GET -Methode anstelle von Post verwendet oder die gehandhabte Methode Ihres Handlers in Post anstatt zu erhalten.

Andere Tipps

Ich möchte nur ein mögliches Szenario hinzufügen, seit eine schnelle Suche nach "TaskQueue 405"Alles landet auf dieser Seite:

Ich habe 405 Fehler, weil kein "Ziel" -Parameter angegeben wurde. taskqueue.add() Fügt dem Standardziel eine Aufgabe hinzu, bei der meine Handler auf einem separaten Backend -Modul befinden.

Wenn das Ziel nicht spezifiziert ist, werden die Aufgaben auf derselben Version der Anwendung aufgerufen, in der sie aufgenommen wurden. Wenn Sie also eine Aufgabe aus der Standard -Anwendungsversion aufgenommen haben, ohne ein Ziel in der Warteschlange anzugeben, wird die Aufgabe in der Standard -Anwendungsversion aufgerufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top