405 status from the task queue

I want to enable status 405, which I get from the task queue when I try to generate a 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 

The code that creates the task

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

and I routed it using webapp2:

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

then I would have to make it a cron job, but when I test it, I get 405 from accessing this code, which expires if I try to run it directly:

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

How can I resolve status 405 and execute execution?

thanks

+6
source share
2 answers

I came from GAE / J-land, so I am not familiar with Python, but before I came across a 405 answer from my task worker. In my case, this is caused by setting the TaskOption method to POST when building the Task , while my handler only serves GET requests.

EDIT: after checking TaskQueue.add () docs , it seems that the default method used if the method is not specified (as in your code example) is POST, while your handler only works with GET requests.

In my proposal, I will explicitly indicate that your task uses the GET method instead of POST or change the processed method of your handler to POST instead of GET.

+14
source

I just want to add one possible scenario, since the quick search for " taskqueue 405 " ends on this page:

I got 405 errors because I did not specify the target parameter. taskqueue.add() ends adding the task to the default target, where my handlers are on a separate backend module.

If the goal is not specified, then the tasks are called in the same version of the application in which they were queued. So, if you task from the default version of the application without specifying the target in the queue, the task starts in the default version of the application.

+1
source

Source: https://habr.com/ru/post/908585/


All Articles